5

我对构造函数注入模式和规则有点困惑不要调用容器;它会打电话给你

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

DomainObject
RepositoryObject
DaoObject

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

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

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

4

2 回答 2

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()

于 2011-07-04T18:23:25.470 回答
1

答案和 Mark Seemann 的链接就足够了,但我想添加一些东西。作为 DI 的初学者(我是),这个问题总是困扰着我:“好吧,没有新的,但是何时以及如何调用和注入我的真实对象?”。我花了一段时间来理解和应用。

当您按照答案和链接进行操作时,您会看到这一点。您应该在您的应用程序 Global.asax 文件中为 Web 应用程序注册您的接口和类。例如,如果您正在使用 Ninject,请转到 nuget 并下载 Ninject.Web(用于 Web 表单)并像在此示例中一样应用它http://azolotar.blog.com/2010/06/22/ninject-2-0-网络表单/

示例中的关键点。

  • Global.asax 继承自 NinjectHttpApplication(在 Ninject.Web.dll 中)
  • CreateKernel 方法被覆盖这是您创建内核并告诉您的依赖映射到容器的地方
  • BasePage :这是针对网络表单的,因此如果页面中的界面都来自基本页面,则它们将被解析。

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

我知道你说没有 MVC 或 web :) 但逻辑是一样的

  • 在应用程序开始时设置您的依赖图( Main? for windows)
  • 由于它不是 web 没有 url 没有直接调用表单,您将调用它如何在 Windows 窗体应用程序中使用 Ninject?如本例所示。不知道您使用的是一些模式 MVP 还是 MVVM,但这可以作为一个起点

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

于 2011-07-04T18:53:19.787 回答