多个应用程序中的依赖注入

时间:2011-02-25 20:49:41

标签: asp.net dependency-injection console ioc-container ninject

我有一个引用数据和实体层的Web。现在我想用一个控制台应用程序来扩展我的解决方案,该应用程序将执行与数据库相关的一些事情,因此也引用了数据和实体层。在我的数据和实体层中,我正在使用依赖注入,并且正在考虑是否需要再次为这些注入声明所有绑定(例如在我的Web应用程序中) - 或者我可以以某种方式共享它们,以便我的Web和控制台应用程序使用相同的绑定?

我的第一个想法是创建一个包含所有绑定的公共库,然后只调用我需要的那些..但是这会导致无意义地引用大量的程序集。

简而言之:如何声明我的依赖注入绑定一次,并在我的Web应用和控制台应用中使用它们?

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

如果您的关注点是让您的业务逻辑程序集不受Ninject模块的影响,您可以选择将它们添加到自己的程序集中,例如: EntityBindingModule.dll并告诉内核在引导程序中加载所有这些: kernel.Load("*BindingModule.dll")

这种方式只是一个部署问题,即添加哪些绑定。

注意:这需要在引导程序加载的程序集和程序集的实际名称之间采用某种约定。在上面的示例中,这些程序集以BindingModule.dll结尾。

答案 1 :(得分:1)

我认为类似的布局可以起作用:

Console (Just Data)  
|  
|--> Ref: Data  
|--> Ninject: Load DataModule  

Web (Both Data and Entity)  
|  
|--> Ref: Data  
|--> Ref: Entity  
|--> Ninject: Load DataModule, EntityModule (should wire up the bindings)  


Data  
|  
|--> Ref: Common  
|--> Data.cs  
|--> DataModule.cs -> Bind<IData>().To<Data>()  

Entity  
|  
|--> Ref: Common  
|--> Entity.cs  
|--> EntityModule.cs -> Bind<IEntity>().To<Entity>()  

Common  
|  
|--> IData.cs  
|--> IEntity.cs 

Ninject documentation详细说明了如何在代码中使用模块。