我正在努力寻找放置 Ninject 配置“模块”的最佳位置(指定类型绑定的位置)。我希望我只是错过了一些明显的技巧,因为这开始成为我使用流畅配置(以及 Ninject)的一个障碍:
在一个简单的 Web 堆栈中,包含三个独立的项目:Web、业务逻辑、数据访问。我不希望 Web 层必须直接引用 DataAccess 层,但我看不到解决这个问题的方法,因为:
如果我把数据访问层数据访问配置模块,我必须引用DataAccess层,以便在Web层实例化Ninject Kernel时可以访问配置模块
如果我把Web层的DataAccess配置模块,我必须引用数据访问层才能访问我想要绑定的类型
如果我把单独配置项目中的 DataAccess 配置模块,当我尝试为 Web 层和数据访问层指定绑定时,我最终遇到了循环引用问题。
IOC 的部分好处是允许松散耦合,但据我所知,使用 Ninject 需要我添加目前拥有的更多直接项目引用。我缺少什么?
Ninject 不要求引用程序集!你可以告诉Kernel
从程序集中加载与特定模式匹配的所有模块 - 请参阅Load()
超载!使用这种机制,您可以将功能公开为模块,正如 @Daniel Marbach 在实现每个功能的地方所建议的那样。我不喜欢这些巨大的模块定义程序集的每个绑定。我宁愿将每个模块都放在一个特定的小模块中以实现特定的功能。
这还允许人们启用/禁用/替换实现,而无需重新编译其他程序集(至少在您的接口位于单独的程序集中的情况下)。
所以基本上你有:
- 一个或多个 Web 层程序集:包含 Web 层的控制器、视图和绑定。每个程序集都引用一些定义它所依赖的接口的程序集。
- 定义 Web 层依赖项的接口的一个或多个程序集。
- 一个或多个业务逻辑程序集实现 Web 层所需的全部或部分接口。引用一些包含它们所依赖的对象的接口的程序集。包含定义它们提供的组件的绑定的模块。
- 定义业务逻辑层依赖项的接口的一个或多个程序集。
- 一个或多个程序集,用于实现业务逻辑层以及可能的某些 Web 层的依赖关系(例如,直接提供的数据而不涉及业务逻辑)。包含他们提供的组件的模块。
- 一个引导程序使用以下方式加载这些程序集的模块
kernel.Load("*.dll")
或类似的。
这样做的好处是:
- 从Web层到业务逻辑层和数据层没有引用
- 业务逻辑层没有到数据层的引用
- 每一层都可以更换,不会对其他层产生任何影响
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)