我可以看到以前曾提出过类似的问题,但是对于 DI 和 .Net 来说是全新的,我无法掌握整个解决方案,或者可能找不到正确的来源......
- 我有程序集 WebAPI、BL、DL。
- WebAPI依赖于BL,
- BL依赖于DL,
- WebAPI 不引用 DL,我想保持不变。还有一些程序集,但这足以说明问题。
WebAPI 有应用程序启动部分,因此我可以使用它来初始化 Ninject 内核并为 WebAPI 项目注册依赖项。
我怎样才能为 BL 和其他程序集实现相同的目标?
有几种不同的方法,您可以使用Ninject 约定自动将每个解析ISomething
为具有相同名称的实现(例如IThing
-> ),或者您可以在每个注册依赖项的程序集中Thing
创建一个Ninject 模块(您的BL 可以在你的 DL 中加载模块)。
您采用的方法取决于您是否需要为不同的对象定义不同的范围,例如,如果您希望将某些事情解析为可能会影响您使用的方法的单例。
我认为Mark Seemann 对此的建议很棒——在应用程序的最高可能层创建一个组合根。对于 Web 应用程序,这意味着在 Globals.asax 文件中。我可以解释这样做的充分理由,但链接的博客文章做得更好。
这确实打破了你试图实现的分层,但只是勉强,我认为这是一种合适的方式。如果您的 Web 层足够薄(即,您可以很容易地用厚客户端替换它),那么这并不是什么大损失。如果你真的反对,你可以在 BL 中为 DL 创建一个组合根。