首先是具有属性
的类型推断类型 var _kernel1 = new StandardKernel();
秒 - 未标记属性
var_kernel2 = new StandardKernel();
应该是,如果我们无法解析第一个kernel1中的类型, 在第二个kernel2中解决它
绑定:
_kernel1.Bind(a =>
{
a.FromThisAssembly()
.SelectAllClasses()
.InheritedFrom<IStepContext>().WithAttribute<MarkAttribute>(x => x.Type == Inheritance.Derived)
.BindSelection(
(t, baseTypes) => baseTypes.Where(bt => bt.IsInterface || bt == t.BaseType));
});
_kernel2.Bind(a =>
{
a.FromThisAssembly()
.SelectAllClasses().BindAllInterfaces();
});
示例:(这种类可以很多)
public interface IStepContext
{
Type WhoIAm();
}
public interface IStepContextAB : IStepContextSecond { }
public interface IStepContextSecond : IStepContext { }
abstract class A : IStepContext { }
class B : A { }
class B1 : A { }
[markAttribute]
class B2 : A { }
class C : IStepContextAB { }
class C1 : IStepContextAB { }
[markAttribute]
class C2 : IStepContextAB { }
class D : IStepContext { }
class D1 :D { }
class D2 : D { }
_kernel.Get<B>() ==> B2
_kernel.Get<IStepContextAB>() ==> C2
_kernel.Get<D>() ==> D
答案 0 :(得分:1)
应该是,如果我们无法解析第一个kernel1中的类型, 在第二个kernel2中解决它
我相信这个问题你要找的是Ninject ChildKernel extension:
此Ninject扩展允许定义子内核。一个 子内核是一个具有父内核的Ninject内核。所有 它无法解决的请求被传递给父内核。
然而,您似乎想要的是conditional bindings:
Bind<IWarrior>().To<Ninja>();
Bind<IWarrior>().To<Samurai>().WhenClassHas<ClimberNeeded>();
Bind<IWarrior>().To<Samurai>().WhenTargetHas<ClimberNeeded>();
Bind<IWarrior>().To<SpecialNinja>().WhenMemberHas<SwimmerNeeded>();