依赖倒置在顶级类(主)

本文关键字:依赖 | 更新日期: 2023-09-27 17:49:56

我想创建一个应用程序,其中我有这两个类,MainApp和模型(在现实中更多,但这是基础和问题的核心)。MainApp也是起始类。我想应用依赖倒置,这样mainApp就不必在每次模型更改时重新构建(好吧,主要是因为它的良好实践)。我不能这样做:

MainApp - - - > IModel
                  ^
                  |
                  |
                Model

因为我必须在MainApp中创建模型,因为它是我的应用程序的开始,它将是多余的。

我正在考虑将MainApp的内容转移到另一个类,并使用MainApp就像MainAppContents和Model的工厂一样,像这样:

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

这是正确的方法,这是否意味着任何一个设计良好的应用程序的开始都是一个工厂?

依赖倒置在顶级类(主)

听起来您是在要求一种方法来启用晚期绑定。为接口编程是第一步,而你已经在这么做了。

下一步是将接口映射到具体类。最简单的方法是使用DI容器。你的Main方法现在看起来像这样:
static void Main()
{
    var container = CreateContainer();
    IModel model = container.Resolve<IModel>();
    // use model...
}

我故意省略了CreateContainer helper方法的实现,因为选择DI容器是另一个问题。

所有主流的。net DI容器都支持后期绑定,因此这将使您能够在另一个程序集中实现IModel。IModel接口应该留在消费者(Main)中。

我不太确定问题是什么,但如果MainApp需要创建Model的实例,那么您应该使用抽象工厂模式,例如IModelFactory,它有一个返回新IModel的方法。

如果你打算使用IoC容器,那么你会希望通过容器解析IModel。与其让IModelFactory依赖于容器,不如使用IoC容器的特性为您创建IModelFactory的具体实现,并隐式地使用容器来解析IModel

编辑

我还会说,买马克的书!太好了!

如果你想实现松散耦合,你应该考虑使用依赖注入容器(例如Unity或MEF)。