有没有办法将对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。
答案 0 :(得分:2)
有两种方法可以处理您的情况,您已经找到了:
Excluding<>
来自约定的类型。
Rebind<IUnitOfWork>
代替Bind。
Rebind
之前执行约定绑定时才有效。当然,您还可以向所有类型添加属性,这些属性应从约定中排除,并相应地调整您的约定。但我怀疑那会更好。
顺便说一下,人们可以想象扩展约定以检查该类型的绑定是否已经存在,并且只创建一个新的绑定(如果它没有)。除了多重和上下文绑定的明显复杂性之外,ninject无法轻松访问以检查是否绑定了一个&#34;实现&#34;类型已经存在。所有的都是IKernel.GetBindings(Type serviceType)
。由于一些内部因素,这很容易改变。