【问题标题】:Can we combine two bindings with different condition?我们可以结合两个不同条件的绑定吗?
【发布时间】:2023-03-26 02:14:01
【问题描述】:

首先对于类型推断具有属性的类型

 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

【问题讨论】:

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


    【解决方案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>();
    

    【讨论】:

    • 如果您有 3 个类,例如:Ninja、Samurai 和 SpecialNinja,这是一个很好的解决方案。但是如果你有很多继承自 IWarrior 的类型怎么办。 ?
    • 类似抽象类 1) A : Interface ;乙:甲; C:A , D[属性]:A ; 2)E:接口; E1:E; 3)Iaa:接口; R : Iaa
    • 看看.WhenInjectedInto().WhenInjectedExactlyInto().WhenAnyAncestorNamed()。否则,请用更多细节更新问题。
    • 请看我添加的例子。你明白我的意思
    • 据我了解,您还没有理解我的问题和示例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多