如何在不同程序集中使用Ninject

7

我看到之前已经有类似的问题被提出了,但作为对DI和.Net完全陌生的人,我无法理解整个解决方案,或者可能没有找到正确的来源...

  • 我的程序集包括WebAPI,BL,DL。
  • WebAPI依赖于BL,
  • BL依赖于DL,
  • WebAPI不引用DL,并且我想保持这样。 还有其他一些程序集,但这足以说明问题。

WebAPI有应用程序启动部分,因此我可以使用它来初始化Ninject Kernel并为WebAPI项目注册依赖项。

我如何为BL和其他程序集实现相同的功能呢?

2个回答

3
有几种不同的方法,您可以使用Ninject Conventions来自动解析每个ISomething到具有相同名称的实现(例如IThing -> Thing),或者您可以在每个程序集中创建一个Ninject Module来注册依赖项(例如BL中的模块可以加载DL中的模块)。
您采取的方法将取决于是否需要为不同对象定义不同的作用域,例如,如果您想要一些东西被解析为单例,则可能会影响您使用的方法。

谢谢Trevor,我理解这个概念,但不知道在BL Assembly中如何实现这个逻辑以及在哪里实现。 - user1767363
您能提供每个模块如何为Ninject设置内核的示例吗?我也在尝试学习如何解决这个问题。 - Wavel
@Wavel - 我已经在答案中添加了链接。 - Trevor Pilley
@user1767363 - 我不确定你的意思是什么。如果你使用Ninject模块,只需在BL程序集中创建一个模块,然后在WebApi程序集中加载它,在那里创建Ninject内核即可。 - Trevor Pilley

0

我认为Mark Seemann关于这个问题的建议非常好——在应用程序的最高层面上创建组合根。对于Web应用程序,这意味着在Globals.asax文件中。我可以详细阐述这样做的好处,但是链接的博客文章做得更好。

这确实破坏了您试图实现的分层结构,但只是轻微地,并且我认为这是一种适当的方式。如果您的Web层足够薄(即,您可以很容易地将其替换为厚客户端),那么这并不是一个大损失。如果您真的不喜欢这样做,您可以在DL中为BL创建一个组合根。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接