Fluent IOC配置/模块的最佳位置(目前正在尝试Ninject)

Jam*_*mes 6 .net configuration dependency-injection ninject inversion-of-control

我正在努力找到找到我的Ninject配置"模块"(指定类型绑定的地方)的最佳位置.我希望我只是错过了一些明显的技巧,因为使用流畅的配置(因此Ninject)开始变成了一个交易破坏者:

在一个包含三个独立项目的简单Web堆栈中:Web,BusinessLogic,DataAccess.我不希望Web层必须直接引用DataAccess层,但我无法看到解决方法,因为:

  • 如果我将DataAccess配置模块放在DataAccess层中,我必须引用DataAccess层,这样我就可以在Web层中实例化Ninject内核时访问配置模块

  • 如果我将DataAccess配置模块放在Web层中,我必须引用DataAccess层才能访问我想要绑定的类型

  • 如果我将DataAccess配置模块放在单独的配置项目中,那么在尝试为web和DataAccess层指定绑定时,我最终会遇到循环引用问题.

IOC的部分好处是允许松散耦合,但据我所知,使用Ninject需要我添加更多我目前拥有的直接项目引用.我错过了什么?

Rem*_*oor 5

Ninject不要求引用程序集!您可以告诉它Kernel从程序集中加载与特定模式匹配的所有模块 - 请参阅Load()重载!使用此机制映射可以将您的功能公开为模块,就像@Daniel Marbach在实现每个功能的地方所建议的那样.我不喜欢这些定义程序集的每个绑定的巨大模块.我宁愿让每个人都在一个特定的小模块中用于某个功能.

这也允许在没有重新编译其他程序集的情况下启用/禁用/替换实现(至少在单独程序集中有接口的情况下).

所以基本上你有:

  • 一个或多个Web层程序集:包含Web层的控制器,视图和绑定.每个程序集都引用一些程序集来定义它所依赖的接口.
  • 一个或多个程序集,用于定义Web层依赖关系的接口.
  • 一个或多个业务逻辑程序集,实现Web层所需的全部或部分接口.引用包含它们所依赖的对象的接口的一些程序集.包含定义它们提供的组件的绑定的模块.
  • 一个或多个程序集,用于定义业务逻辑层的依赖关系的接口.
  • 一个或多个程序集,它们实现业务逻辑层的依赖关系以及可能的某些Web层(例如,直接提供业务逻辑的数据).包含它们提供的组件的模块.
  • 一个引导程序使用kernel.Load("*.dll")或类似地加载这些组件的模块.

这样做的好处是:

  • 没有从Web层到业务逻辑层和数据层的引用
  • 没有从业务逻辑层到数据层的引用
  • 每层都可以更换,而不会对其他层产生任何影响