我在Visual Studio中有多个项目,每个程序集都有一个Ninject-Moduledefinition . 该解决方案的结构为“洋葱架构” . 模块仅在项目中加载,并引用程序集 .
我有这些图层
-
存储库
-
BusinessLayer
-
Web-UI
目前,Web-UI-Layer不需要引用存储库,因为BusinessLayer的Ninject-Moduleloader得到了Repository-Moduleloader的所有引用绑定 .
My Repository-Layer没有对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());
}
-
为什么此配置不适用于由BusinessLayerModuleLoader本身加载的模块?
-
是第一个只绑定配置的语句,还是从"*.dll"找到的所有程序集中加载NinjectModules?在那种情况下,我不需要第二个声明"kernel.Load(new BusinessLayer..."对吗?
1 回答
第一个语句(
kernel.Bind(i => i.From(....));
)正在搜索所有已部署的* .dll用于具有与"default interface"约定匹配的接口的类型,即: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...
的NinjectActivationException
.提示:之前已经在SO上询问了如何参数化
NinjectModule
中应用的范围的问题 .