在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());
}
  1. 为什么此配置不适用于BusinessLayerModuleLoader本身加载的模块
  2. 第一个语句是仅绑定配置,还是已经从"*.dll"找到的所有程序集中加载了NinjectModules?在这种情况下,我不需要第二条语句"kernel.Load(new BusinessLayer…",对吧

在Onion架构中设置Ninject模块的作用域

第一条语句(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上提出过。