我应该按项目分离IoC绑定分离

时间:2015-03-09 10:02:32

标签: c# oop design-patterns domain-driven-design ninject

我是域驱动设计架构的新手。我的项目解决方案是这样的:

  • 表示(网络)
  • 应用层
  • QueryLayer
  • QueryHandlerLayer
  • 数据层

我从那些文章中读到了隔离工作以隔离工作。

演示文稿项目参考 ApplicationLayer 但是没有引用QueryLayer,QueryHandlerLayer和DataLayer。

但我正在使用IoC容器并将类型绑定到接口。

  • container.Bind(数据接口).To(数据类);
  • container.Bind(查询接口).To(查询类);

我可以在PresentationLayer上执行此操作。但现在所有项目都将添加对表示层的引用。

这是关于架构的问题吗?或者我可以为所有图层分离IoC容器绑定吗?

2 个答案:

答案 0 :(得分:2)

使用DI是关于组合应用程序。应用程序可能有多个层,但它们仍然是同一个应用程序的一部分,必须组合在一起。

撰写应用程序的适当位置在composition root,应该尽可能接近应用程序的入口点。

基本上有3种常见的建议来组合具有多个层的应用程序,并且所有这些建议都是完全可以接受的。

  1. 不要将图层分隔为物理组件。
  2. 在表示层中编写应用程序,并引用表示层中的所有其他图层。
  3. 创建一个引用所有其他图层的单独合成图层。
  4. 对于第3个选项,您应该记住,合成层应该驱动,而不是由应用程序的其余部分驱动。

    请参阅this answer了解此引用背后的原因以及为什么从 引用组合根中的每个库以避免紧密耦合非常重要。或者,如上所述,只要您的部署脚本通过DLL复制,您就可以使用后期绑定来组合应用程序而无需直接引用程序集。

答案 1 :(得分:1)

我认为我在最近的使用中学到的最重要的事情是,在基础层面,DI是关于注入依赖性的。这是一个非常多余的描述,所以让我详细说明:

DI从设计开始。一切都应该通过构造函数或某种工厂提供它所需要的东西。这是Interfaces是你最好的朋友。完成此操作后,大部分工作就完成了。假设某些项目是共享的,您现在已将所有工作委托给使用它的任何人。然而,这可能是旧闻。

接下来,如果您控制容器,请考虑创建一个默认模块,在Ninject的情况下为NinjectModule。为每个应用程序层创建其中一个。这将形成"指令"可以这么说,对于程序最高级别的容器来说,将所有部分放在一起。

这可以通过反射技巧加载,其中有大量信息,like this

然后就像加载所有这些绑定"说明手册一样简单"进入组合根(通常在应用程序中),你很高兴。