在整个解决方案中使用共享依赖注入

时间:2014-10-01 11:21:14

标签: c# asp.net ninject quartz.net

在我的解决方案中,我有一个主项目,一个 WebUI 项目,还有一些支持子项目,例如 Domain 用于数据库访问,石英项目用于运行预定 Quartz 等工作

直到最近我才在主项目中成功使用 ninject ,但现在我还需要在其他项目中使用ninject。我是否可以在整个解决方案中共享依赖关系,这意味着从任何地方访问所有bean,或者我只能在单个项目中访问它们?

我尝试将它们注入新项目,但未找到绑定:

No matching bindings are available, and the type is not self-bindable.

是否可以在解决方案中包含多个ninject内核,假设每个内核只在单个Project中使用?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我认为Kernel应该与应用程序入口点一对一。这是组合根,是定义Ninject内核的地方,以便它可以解析将为应用程序构建的完整对象图的类型。内核可以从NinjectModule实例的集合构造。您可以在模块中定义绑定。如果您有多个应用程序将使用您定义的类型层次结构,我将在程序集内部的自定义NinjectModules中创建绑定。然后,根据您的应用程序,您可以在创建内核时混合和匹配模块。这应有助于减轻每个应用程序中绑定的重复,并且它们将位于可重用的位置。

特别是在你的情况下我会:

  • 创建一个DomainModule并指定特定于您的域的所有绑定。
  • 创建QuartzModule并指定特定于作业调度的所有绑定。
  • 您也可以创建一个WebUI模块,但这只适用于您的WebUI项目,它也是您的组合根目录。因此,它不会在将来的应用程序中重复使用。如果需要,可以将绑定直接添加到此项目的内核中。如果您有一个特定于WEB的项目,例如您的控制器等,您可能需要创建一个模块以供参考。
  • 通过引用其他应用程序中的模块来编写WebUI项目中的内核:kernel.Load(new [] {DomainProject.DomainModule,SchedulingProject.JobModule});

Modules and the Kernel Documentation

答案 1 :(得分:1)

你可以,但要使它工作,你必须在每个可以运行的项目中创建内核和绑定。所以对于ex,如果你有一个web prj一个域逻辑prj一个控制台应用程序你必须在web和控制台内创建内核。这两个prj将引用域登录prj,然后共享。