2011-04-12 65 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!这很棒!