关于.net:构造函数注入 – 在哪里调用?

Constructor Injection - where to call?

我对构造函数注入模式有点困惑,规则不调用容器;它会调用您。

有人能告诉我(也许还有其他人)真实的应用程序应该如何使用构造函数注入来获得所有DI优势吗?我举了几个简单的例子:

1
2
3
DomainObject
RepositoryObject
DaoObject

这种关系很明显(我认为)——repositoryObject需要DAOObject,domainObject需要repository。

使用构造函数注入,我假设我可以忘记(在大多数情况下)关于新关键字的内容,但是我应该在何时、何地以及如何创建新对象(主要是域)?我必须为所有班级写工厂?我应该参考那个工厂的DI集装箱吗?

最好是有人给我看一些真实的应用程序示例(请不要是ASP.NET MVC:)或者画一些项目结构。


答案和MarkSeemann的链接已经足够了,但我想补充一些内容。作为DI(我是)的初学者,这个问题总是困扰着我:"好吧,没有新的东西,但是何时以及如何调用和注入真正的对象?"我花了一段时间才理解和应用。

当你遵循答案和链接时,你会看到。您应该在Web应用程序的applications global.asax文件中注册接口和类。例如,如果您使用ninject,请转到nuget并下载ninject.web(用于webforms),然后像在本例中一样应用它:http://azolotar.blog.com/2010/06/22/ninject-2-0-in-webforms/

示例中的关键点。

  • global.asax继承自ninjecthttpapplication(位于ninject.web.dll中)
  • createCkernel方法被重写,这是创建内核并告诉依赖映射到容器的地方。
  • basepage:这是针对webforms的,所以如果页面中的接口都是从basepage派生的,那么它们将被解析。

我应该补充一点,基本页的实现非常简单(这里是GitHub上的代码),您可能已经有了一个基本页,所以添加这行kernelcontainer.inject(this);到基本页的OnInit可以解决这个问题。最后一个余数,如果要在ascx中使用任何内容,则应重写ascx的oninit,以便容器可以解决依赖项。

我知道你说的不是MVC或Web:)但是逻辑是一样的

  • 在应用程序开始时设置依赖关系图(主?对于Windows
  • 由于它不是Web,没有URL,没有直接调用表单,您将如何在Windows窗体应用程序中调用它?在这个例子中。不知道您是否使用了一些模式MVP或MVVM,但这可能是一个起点。

该死的,这听起来没什么帮助,但无论如何,希望这有帮助。


我不了解你的班级关系,所以这里有一个更明显的例子;-)例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class FooService
{
    IFooRepository FooRepository { get; set; }

    public Service(IFooRepository fooRepository)
    {
        this.FooRepository = fooRepository;
    }
}

class Controller
{
    IFooService FooService { get; set; }
    IBarService BarService { get; set; }

    public Controller(IFooService fooService, IBarService barService)
    {
        this.FooService = fooService;
        this.BarService = barService;
    }
}

正如您已经说过的,任何地方都没有new FooRepository()new FooService()代码。