在Onion架构中设置Ninject模块的作用域
本文关键字:Ninject 模块 作用域 设置 Onion | 更新日期: 2023-09-27 18:26:41
我在Visual Studio中有多个项目,每个程序集都有一个Ninject Moduledefinition。此解决方案的结构为"洋葱架构"。模块仅在具有对程序集的引用的项目中加载。
我有这些层
- 存储库
- BusinessLayer
- Web UI
目前Web UI-Layer不需要引用存储库,因为BusinessLayer的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());
}
- 为什么此配置不适用于BusinessLayerModuleLoader本身加载的模块
- 第一个语句是仅绑定配置,还是已经从"*.dll"找到的所有程序集中加载了NinjectModules?在这种情况下,我不需要第二条语句"kernel.Load(new BusinessLayer…",对吧
第一条语句(kernel.Bind(i => i.From(....));
)在所有部署的*.dll中搜索具有与";默认接口";约定,即:Typename以接口名称结尾(不带前导I),例如:";Foo->IFoo"条形图->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个绑定,因为约定已经绑定了它。这将导致一个NinjectActivationException
,消息为...more than one matching binding available...
。
提示:如何对NinjectModule
中应用的作用域进行参数化的问题以前曾在SO上提出过。