C# FromAssembliesMatching显式覆盖集合绑定

C# FromAssembliesMatching显式覆盖集合绑定,c#,ninject,ninject-conventions,C#,Ninject,Ninject Conventions,有没有一种方法可以将对FromAssembliesMatching的调用结合起来,自动设置大多数接口和一些显式绑定?我有以下代码,可以自动将所有ISomething设置为某个值,然后为IUnitOfWork接口设置一个特定的构造函数,其中具体实现接受两个bool作为参数: kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses() .InNamespaces("MyNamespace").Bin

有没有一种方法可以将对FromAssembliesMatching的调用结合起来,自动设置大多数接口和一些显式绑定?我有以下代码,可以自动将所有ISomething设置为某个值,然后为IUnitOfWork接口设置一个特定的构造函数,其中具体实现接受两个bool作为参数:

kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses()
        .InNamespaces("MyNamespace").BindDefaultInterface());
kernel.Bind<IUnitOfWork>().ToConstructor(x => new UnitOfWork(true, false));
kernel.Bind(x=>x.fromsassembliesmatching(“*.dll”).SelectAllClasses()
.InNamespaces(“MyNamespace”).BindDefaultInterface();
Bind().ToConstructor(x=>newunitofwork(true,false));
但是,当我尝试像这样调用TryGet时,我得到一个空值:

kernel.TryGet<MyNamespace.IUnitOfWork>()
kernel.TryGet()
当我切换顺序并在第二次调用中显式调用UnitOfWork实现的排除时,它可以正常工作:

kernel.Bind<IUnitOfWork>().ToConstructor(x => new UnitOfWork(true, false));
kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses()
      .InNamespaces("MyNamespace").Excluding(typeof(UnitOfWork))
      .BindDefaultInterface());
kernel.Bind().ToConstructor(x=>newunitofwork(true,false));
Bind(x=>x.fromsassembliesmatching(“*.dll”).SelectAllClasses()
.InNamespaces(“MyNamespace”)。不包括(typeof(UnitOfWork))
.BindDefaultInterface());
当我尝试解析IUnitOfWork的实例时,颠倒顺序,或者忽略对排除的调用,会再次导致null


将自动匹配与显式配置相结合的正确方法是什么?我正在使用Ninject 3.2.0.0和Ninject.Extensions.Conventions 3.2.0.0。

有两种方法可以处理您的情况,您已经找到了一种:

  • 从约定中排除类型。
    
    • 优点:这与“手册”和约定绑定的顺序无关
    • 缺点:您需要在公约和“手册”绑定中的两处提及特殊情况
  • 使用
    重新绑定
    而不是绑定。
    • 优点:你不需要在两个地方提及特殊情况
    • 缺点:只有在执行
      重新绑定之前执行约定绑定时,此选项才有效
当然,您也可以向所有类型添加属性,这些属性应该从约定中排除,并相应地调整约定。但我怀疑这样会更好

顺便说一句,我们可以想象这样的事情:扩展约定以检查该类型的绑定是否已经存在,并且仅在不存在的情况下创建新绑定。除了多绑定和上下文绑定的明显复杂性之外,ninject无法轻松检查“实现”类型的绑定是否已经存在。这里只有
IKernel.GetBindings(类型serviceType)
。由于一些内部因素,这是不容易改变的