FromAssembliesMatching覆盖显式设置绑定

时间:2014-09-26 07:08:00

标签: c# ninject ninject-conventions

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

kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses()
        .InNamespaces("MyNamespace").BindDefaultInterface());
kernel.Bind<IUnitOfWork>().ToConstructor(x => new UnitOfWork(true, false));

然而,当我尝试像这样调用TryGet时,我得到一个null:

kernel.TryGet<MyNamespace.IUnitOfWork>()

当我切换订单并在第二次调用时显式调用Excout for UnitOfWork实现时,它工作正常:

kernel.Bind<IUnitOfWork>().ToConstructor(x => new UnitOfWork(true, false));
kernel.Bind(x => x.FromAssembliesMatching("*.dll").SelectAllClasses()
      .InNamespaces("MyNamespace").Excluding(typeof(UnitOfWork))
      .BindDefaultInterface());

当我尝试解析IUnitOfWork的实例时,颠倒顺序,或者再次将调用排除结果为null。

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

1 个答案:

答案 0 :(得分:2)

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

  • Excluding<>来自约定的类型。
    • 优点:这与您的&#34;手册&#34;的序列无关。和你的约定绑定。
    • 缺点:你需要在两个地方参考特殊情况,在公约和&#34;手册&#34;结合
  • 使用Rebind<IUnitOfWork>代替Bind。
    • 优点:您不需要在两个地方参考特殊情况。
    • 缺点:仅在执行Rebind之前执行约定绑定时才有效。

当然,您还可以向所有类型添加属性,这些属性应从约定中排除,并相应地调整您的约定。但我怀疑那会更好。

顺便说一下,人们可以想象扩展约定以检查该类型的绑定是否已经存在,并且只创建一个新的绑定(如果它没有)。除了多重和上下文绑定的明显复杂性之外,ninject无法轻松访问以检查是否绑定了一个&#34;实现&#34;类型已经存在。所有的都是IKernel.GetBindings(Type serviceType)。由于一些内部因素,这很容易改变。