2014-09-26 51 views
0

有没有一种方法可以将调用与FromAssembliesMatching结合起来以自动设置大多数接口并使用一些显式绑定?我有以下的代码应该将所有自动ISomething的东西,然后建立了地方的具体落实接受两个布尔变量作为自变量的IUnitOfWork接口的特定构造:FromAssembliesMatching覆盖明确设置的绑定

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明确:

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

颠倒顺序,或者在尝试解析IUnitOfWork的实例时再次将调用排除在空外。

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

回答

1

有两种方法来处理你的情况,你一个已经找到:

  • Excluding<>从约定的类型。
    • 优点:这是你的“手册”和约定绑定的序列不可知的。
    • 缺点:您需要参考的特殊情况的地方,在公约和“手动”使用Rebind<IUnitOfWork>而不是绑定结合
    • 优点:你不需要参考两个地方的特例。
    • 缺点:这只适用于在执行Rebind之前执行约定绑定的情况。

当然,你也可以将属性添加到应该从约定排除所有类型的并相应地调整你的约定。但我怀疑这会更好。

顺便说一句,我们可以想象扩展约定来检查该类型的绑定是否已经存在,并且只创建一个新的绑定(如果没有)。除了多重绑定和上下文绑定的明显复杂性之外,ninject并不容易检查是否存在对“实现”类型的绑定。全部是IKernel.GetBindings(Type serviceType)。由于一些内部原因,这不能轻易改变。