首页 文章

为洋葱架构中的Ninject模块设置范围

提问于
浏览
1

我在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 回答

  • 0

    第一个语句( 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 中应用的范围的问题 .

相关问题