我们可以结合两种不同条件的绑定吗?

时间:2016-12-07 20:26:10

标签: c# dependency-injection ninject inversion-of-control ioc-container

首先是具有属性

的类型推断类型
 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

1 个答案:

答案 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>();