2011-04-12 51 views
2

我想創建一個應用程序,其中我有這兩個類,MainApp和Model(實際上更多,但這是問題的基礎和核心)。 MainApp也是首發班。我想應用依賴倒置,所以mainApp不必在每次模型更改時重建(主要是因爲它的良好實踐)。我不能做到這一點:頂級依賴倒置(主)

MainApp - - - > IModel 
       ^
        | 
        | 
       Model 

,因爲我在MainApp創建示範無論如何,因爲這是我的應用程序的開始,這將是多餘的。

我在想MainApp的內容轉移到另一個類,並使用MainApp就像工廠MainAppContents和型號,像這樣:

MainApp -------------> Model 
    |      | 
    |      | 
    v      v 
MainAppContents - - - > IModel 

這是正確的做法,這是否意味着,任何啓動一個設計良好的應用程序是工廠?

回答

3

這聽起來像你要求的方式來啓用後期綁定。編程到接口是第一步,你已經這樣做了。

下一步是將映射到具體類的接口。最簡單的方法是使用DI容器。您主要方法現在看起來可能是這樣:

static void Main() 
{ 
    var container = CreateContainer(); 
    IModel model = container.Resolve<IModel>(); 
    // use model... 
} 

我省略了CreateContainer輔助方法的實現上目的,因爲selecting a DI Container is a different question

所有支持.NET的主流DI容器都支持後期綁定,所以這將使您能夠在另一個程序集中實現IModel。 IModel接口應該與消費者(主)保持一致。

+0

謝謝,這就是我一直在尋找的。 – hcb 2011-04-12 08:55:44

0

如果你想實現鬆耦合,你應該考慮使用依賴注入容器(例如UnityMEF)。

+0

謝謝,我一定會看看這些選項。然而,這並不能解決我所遇到的設計問題,實際上我正在尋找一個類結構。 – hcb 2011-04-12 08:19:48

1

我不太清楚是什麼問題,但如果MainApp需要創建的Model情況,那麼你應該使用抽象工廠模式,例如IModelFactory其中有一個返回新IModel的方法。

如果您打算使用IoC容器,那麼您需要通過容器來解析IModel。您可以使用IoC容器的功能爲您創建具體的實現IModelFactory,而不是讓您的IModelFactory依賴於您的容器,而是隱式使用該容器來解析IModel

編輯

我也想說,跟馬克的book!這很棒!