2014-12-05 41 views
2

介紹

我工作在C#有一個自制的依賴注入框架(我的也許是一個傲慢的錯誤,目前正在考慮改用Ninject)。如何對一系列依賴用戶輸入和相互依賴的過程使用控制反轉?

我有3種方法中,由類表示:

GetInput

這是負責經由GUI獲取用戶輸入。 GUI通過輸入字段顯示所需的值,並將用戶輸入返回給過程。它的依賴關係是:一個GUI控制器以及我希望它獲得的值(例如「Foo」)。

BuildFile

這是負責將一系列值映射到模板中的鍵。該模板包含一些文本,該類填充空白並返回完成的文件。它的依賴關係是:模板文件,靜態鍵值(常量)和動態鍵值,其值應來自GetInput進程。

WriteFile

這是負責將文件寫入磁盤。它的依賴關係是:文件路徑和文件內容,其中文件內容應該來自BuildFile進程。

理想狀況

我希望能夠配置這些3個處理不同文件類型的組合。例如:

ConfigurationA

GetInput("Foo", "Bar") returns UserInput1, UserInput2
BuildFile(TemplateFileContent, {"StaticKey", "StaticValue"}, {"Foo", UserInput1}, {"Bar", UserInput2}) returns FileContent
WriteFile("C:/Some/Path.txt", FileContent)

現狀

我試圖建立在我的應用程序的根組成這些配置,我只是不能讓它工作。依賴於用戶輸入使得在給出用戶輸入之前不可能解決依賴關係,並且每個進程對前一個進程的依賴性也是一個挑戰。

問題

你會如何去關聯這些依賴關係?

是否有我應該使用的DI模式?

回答

0

如果您的用戶輸入在解析時不可用,那麼您需要更改您的應用程序以使其獲取輸入,然後使用它來解決依賴關係,或者您需要通過使用當GetInput類中的某些方法/事件激發時,方面將「攔截」。基本上你會想要將BuildFile連接到用戶輸入可用時的時間點。

說了這麼多的話,你的課程看起來並不像對象那麼重要,但更像是住房程序代碼,它們是順序執行的,我認爲你的問題大部分來自於這些代碼。例如,您可以通過將BuildFile和WriteFile組合到一個名爲FileBuilder的類中來簡化代碼,並通過名爲Write()的方法公開寫入功能。

編輯: 如果你走的是截取的路線,你應該開始使用現有的DI框架,因爲推出自己的框架會很有挑戰性。至於它的實現,您需要創建一個工廠方法,該方法根據輸入返回FileBuilder依賴項的特定實例。這可以在攔截器內部通過檢查輸入並調用FileBuilder特定實例的解析來完成,或者,正如我通常爲了更好地分離關注點一樣,將輸入傳遞給BuildFile依賴項的解析並讓返回的實例由連接到BuildFile註冊的工廠方法確定。允許位於DI註冊代碼中的工廠方法知道有關接口實現的細節是有效的。

+0

您的第二段是我已經完成的工作。它工作正常,並且解決了BuildFile進程和WriteFile進程之間的依賴關係問題,但是解決了用戶輸入依賴關係。 – Draknir 2014-12-10 08:45:10

+0

至於第一段,它如何看待'獲取輸入然後用它來解決依賴關係'?你知道有這樣或那樣的例子嗎?我會對其他框架進行一些研究,看看它們是否提供了你提到的'截面'。 – Draknir 2014-12-10 08:47:53

+0

這取決於您的應用程序正在使用的框架/堆棧以及註冊對象的距離。假設你正在編寫一個Web應用程序,如果你使用的是ASP.NET MVC,並且正在註冊你的控制器/視圖,那麼你可以在一個攔截器內部連接一個控制器/視圖方法的依賴關係解析器,在溫莎城堡是這種模式最強大的,Ninject有一個擴展,允許你完成同樣的事情。 – moarboilerplate 2014-12-11 16:03:59