非常新的Ninject。我有一个像这样的项目......
演示层>服务层>数据访问层
我在演示文稿层上安装了 Ninject ,因此我的控制器可以正常使用服务层(因为我的演示层有一个参考到服务层)。
以下是示例(我的演示文稿图层的 NinjectWebCommon.cs 中的代码):
'Works within my Presentation Layer
kernel.Bind<Service.IOrders>().To<Serice.Orders>();
'Does NOT Work within my Presentation Layer since it does not know about my dataAccess layer
kernel.Bind<DataAccess.IOrdersRepository>().To<DataAccess.OrdersRepository>();
那么如何以这种方式设置我的Ninject,以便我可以从仅一个地方注入而无需引用我的数据访问层。
答案 0 :(得分:1)
使用依赖注入时,应该有一个组合根知道所有绑定。 另请参阅Mark Composition Root上的Mark Seeman博客文章。
这意味着它需要引用您的DAL。 如果您确实需要将表示层与DAL分开,则需要将组合根提取到不包含表示层的单独程序集(应用程序)中。应用程序程序集将定义所有绑定并组成对象图。为此,它需要引用所有其他程序集(表示层,DAL,......不是)。
但是,ninject和AutoFac提供了稍微不同的设计选择:模块(有关ninject描述,请参阅here)。在Modules @ DAL程序集中定义DAL绑定,在模块@ presentation assembly中定义表示绑定,然后在反射中定义所有已部署程序集的所有模块。例如:
-- presentation.dll
- PresentationModule : NinjectModule
--> defines presentation bindings
-- dal.dll
- DataAccessModule : NinjectModule
--> defines data access bindings
-- app.dll (asp.net mvc application)
- creates kernel
- then searches for all deployed *.dll's,
in those it searches for all implementations of `NinjectModule`
and then loads these. This is done by:
kernel.Load(AppDomain.CurrentDomain.GetAssemblies())
- does not reference dal.dll or presentation.dll!
请注意,我不确定AppDomain.CurrentDomain.GetAssemblies()
是否适用于asp.net应用程序。也许您需要一些其他方法来查找所有已部署的程序集。
另请注意,除非您需要有层(也请参见here)或更改图层而不重建整个应用程序,否则没有必要为单独的图层使用单独的程序集。
还有一些类似的问题和答案:
您可能还想查看this blog post