2014-10-01 118 views
0

在我的解决方案使用共享的依赖注入,我有一个主要项目,一个WebUI中项目,以及一些配套子项目,例如的数据库访问,通过运行调度作业石英项目石英在整体解决方案

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

我试图将其注入到新的项目,但结合不发现:

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

那是正确的,有内部解决方案假设每个仅单个项目内部使用一个以上的ninject内核?或者,还有更好的方法?

回答

3

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

特别是在你的情况我会:

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

Modules and the Kernel Documentation

1

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