构造函数注入 - 在哪里调用?

时间:2011-07-04 17:49:25

标签: .net dependency-injection constructor-injection

我对构造函数注入模式和规则Don’t call the container; it’ll call you感到有些困惑。

有人可以解释我(也许还有其他人)真正的应用程序如何使用构造函数注入获得所有DI优势?我给出了一些简单的,我想的常见例子:

DomainObject
RepositoryObject
DaoObject

关系很明显(我认为) - RepositoryObject需要DaoObject,DomainObject需要Repository。

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

当有人向我展示一些真实的应用程序示例(请不要使用Asp.Net MVC :))或绘制一些项目结构时,最好的将是。

2 个答案:

答案 0 :(得分:1)

我没有得到你的阶级关系所以这里更明显;-)例如:

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()代码。

答案 1 :(得分:1)

答案和Mark Seemann的链接已足够但我想补充一些东西。作为DI的初学者(我是),这个问题总是让我感到困惑:“好吧,没有什么新东西,但我的真实物体何时以及如何被调用和注入?”。我花了一段时间才理解并申请。

当您按照答案和链接进行操作时,您会看到。您应该在Web应用程序的应用程序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中)
  • 重写CreateKernel方法,这是您创建内核并将您的dependecy地图告诉容器的地方
  • BasePage:这适用于webforms,因此如果页面中的界面都是从基页派生的,那么它们将被解析。

我应该添加这个,BasePage实现非常简单(这里是github上的代码)你可能已经有了一个基页,所以添加这行KernelContainer.Inject(this);到您的基页的OnInit可以解决问题。最后一个余数,如果你打算在ascx中使用任何东西,你应该覆盖你的ascx的OnInit,所以容器可以解决依赖。

我知道你说没有MVC或网络:)但逻辑是相同的

  • 在应用程序启动时设置您的依赖地图(主要用于Windows)
  • 由于它不是网络没有网址没有直接调用表单,因此您将在此示例中将其称为How to use Ninject in a Windows Forms application?。不知道你是否使用了一些模式MVP或MVVM,但这可以作为一个起点

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