依赖注入 - 将依赖关系一直向下传递

时间:2012-11-07 22:05:58

标签: asp.net-mvc dependency-injection castle-windsor

我有一个典型架构的MVC应用程序......

  

ASP.NET MVC控制器 - >人员服务 - >人员存储库 - >实体框架数据库上下文

我正在使用Castle Windsor,我可以看到使用它和ControllerFactory创建具有正确依赖关系的控制器的好处。使用这种方法,Controller获得一个服务注入,这反过来知道如何构建正确的存储库,而存储库又知道要使用的正确的DbContext。

windsor配置是这样的......

dicontainer = new WindsorContainer();
dicontainer.Register(Component.For<IPersonService>().ImplementedBy<PersonService>());
dicontainer.Register(
    Component.For<IPersonRepository>().UsingFactoryMethod(
        () => new PersonRepository(new HrContext("connectionString"))));

这是正确的方法吗?我不喜欢UsingFactoryMethod,但不能想到另一种方式。

此外,如果存储库需要服务层不需要的依赖项(比如ILogger),该怎么办?这是否意味着我必须将ILogger传递到服务层而不使用它。这似乎是一个糟糕的设计。我很欣赏这里的一些指示。我已阅读大量文章,但没有找到一个具体的例子来验证我是否正确这样做。感谢。

1 个答案:

答案 0 :(得分:1)

我尽量避免使用工厂方法(正如你所提到的,你觉得这闻起来很有趣)。为避免这种情况,您可以创建一个用于创建新DbContext的数据库会话对象。然后您的存储库只需要获取IDbSession的实例并使用其dbContext属性。然后,您还可以轻松控制IDbSession对象的范围(不要使用单例,因为它不是线程安全的。)

我想提出这一点,以便我可以使这一点更加重要......让构造函数只接受在DI容器中注册的对象(构造函数中没有选项或配置)。选项和配置应该在类中读/写,其唯一目的是读/写这些值。如果所有类都遵循此模型,那么您的DI注册变得简单,类可以在其构造函数中添加它们所需的任何依赖项。

如果您尝试使用在构造函数中具有选项的第三方库,请将该类包装在您自己的类中,该类具有易于使用的构造函数并使用配置类来读取传递给第三方库所需的值。此设计还在您的代码和第三方库之间引入了一个抽象层,然后可以在必要时更轻松地交换(或存根)第三方库。

相关问题