0

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

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

但是,当我尝试像这样调用 TryGet 时,我得到一个空值:

kernel.TryGet<MyNamespace.IUnitOfWork>()

当我切换顺序并在第二次调用中明确调用 UnitOfWork 实现的 Excluding 时,它工作正常:

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

当我尝试解析 IUnitOfWork 的实例时,颠倒顺序或省略对 Excluding 的调用会再次导致 null。

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

4

1 回答 1

2

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

  • Excluding<>约定的类型。
    • 优点:这与您的“手册”和约定绑定的顺序无关。
    • 缺点:需要在约定和“手动”绑定两个地方参考特殊情况
  • 使用Rebind<IUnitOfWork>而不是绑定。
    • 优点:不需要参考两个地方的特例。
    • 缺点:仅当您在执行Rebind.

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

顺便说一句,人们可以想象类似扩展约定以检查该类型的绑定是否已经存在,如果不存在则仅创建新绑定。除了多重绑定和上下文绑定的明显复杂性之外,ninject 无法轻松检查“实现”类型的绑定是否已经存在。一切都是IKernel.GetBindings(Type serviceType)。而且由于一些内部结构,这不能轻易改变。

于 2014-09-26T11:04:13.477 回答