我在Visual中有多个项目,每个程序集都有一个尼尼微模块定义。这个解决方案的结构是“洋葱架构”。模块仅在带有程序集引用的项目中加载。
我有这些图层
目前,Web层不需要引用存储库,因为BusinessLayer get的Ninject Moduleloader所有引用的绑定都来自Repository-Moduleloader
我的存储库层没有对ASP.Net程序集的任何引用。因此,我不能将NinjectModules的范围设置为"InRequestScope“。我现在正试图在WebUI层中设置ModuleLoader的配置,但是存储库的模块仍然不是"InRequestScope“。
private static void RegisterServices(IKernel kernel) {
kernel.Bind(i => i.From("*.dll")
.SelectAllClasses()
.BindDefaultInterface()
.Configure(x => x.InRequestScope()));
kernel.Load(new BusinessLayer.BusinessLayerModuleLoader());
kernel.Load(new WebUIInjector());
}发布于 2015-12-14 10:35:56
第一个语句(kernel.Bind(i => i.From(....));)是搜索所有已部署的*..dll的类型,这些类型具有与“默认接口”约定相匹配的接口,即: Typename以接口名称结尾(没有前面的I),例如:"Foo -> IFoo“、"Bar -> IBar”、"SomeFoo : IFoo“。它不加载任何模块。
Kernel.Load运行NinjectModule的Load方法,该方法可以添加其他绑定。首选的选择是使用kernel.Load<BusinessLayer.BusinessLayerModuleLoader>()并将其命名为BusinessLayerModule而不是BusinessLayerModuleLoader。
要加载所有已部署的dll的所有模块,请运行:kernel.Load("*.dll");。有关模块和模块加载的更多信息,请参见:https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel
注意:如果一个模块要执行Bind<IFoo>().To<Foo>(),那么IFoo将有2个绑定,因为约定已经对它进行了绑定。这将导致带有消息...more than one matching binding available...的...more than one matching binding available...。
提示:关于如何参数化在NinjectModule中应用的作用域的问题,以前曾有人问过。
https://stackoverflow.com/questions/34240411
复制相似问题