我看到之前已经有类似的问题被提出了,但作为对DI和.Net完全陌生的人,我无法理解整个解决方案,或者可能没有找到正确的来源...
- 我的程序集包括WebAPI,BL,DL。
- WebAPI依赖于BL,
- BL依赖于DL,
- WebAPI不引用DL,并且我想保持这样。 还有其他一些程序集,但这足以说明问题。
WebAPI有应用程序启动部分,因此我可以使用它来初始化Ninject Kernel并为WebAPI项目注册依赖项。
我如何为BL和其他程序集实现相同的功能呢?
ISomething
到具有相同名称的实现(例如IThing
-> Thing
),或者您可以在每个程序集中创建一个Ninject Module来注册依赖项(例如BL中的模块可以加载DL中的模块)。我认为Mark Seemann关于这个问题的建议非常好——在应用程序的最高层面上创建组合根。对于Web应用程序,这意味着在Globals.asax文件中。我可以详细阐述这样做的好处,但是链接的博客文章做得更好。
这确实破坏了您试图实现的分层结构,但只是轻微地,并且我认为这是一种适当的方式。如果您的Web层足够薄(即,您可以很容易地将其替换为厚客户端),那么这并不是一个大损失。如果您真的不喜欢这样做,您可以在DL中为BL创建一个组合根。