是多个ninject绑定保证保持其绑定顺序

时间:2011-10-21 08:31:59

标签: c# dependency-injection ninject

如果我注册:

Bind<IWeapon>().To<Sword>();
Bind<IWeapon>().To<Knife>();
Bind<IWeapon>().To<ChuckNorris>();

然后通过:

检索
IEnumerable<IWeapon> weapons = ServiceLocator.Current.GetAllInstances<IWeapon>();

我保证绑定将始终以该顺序返回吗?

我尝试过,似乎确实如此,但这可能是偶然的。

2 个答案:

答案 0 :(得分:6)

简短回答:不,你不是!

更长的回答:当前的实施保留了订单。但是在Ninject的未来版本中仍然会出现这种情况并不保证。此外,您不应该在IoC容器配置中拥有此类业务规则。

答案 1 :(得分:0)

我找到了一种执行有序多重绑定的方法,因为我也需要这样做:

(非常类似于我在这里的回答:https://stackoverflow.com/a/56306527/50088

   // Binding
   public sealed class FooModule: NinjectModule 
   {
     public opverride void Load() 
     {
        Bind<IReadOnlyList<IFoo>>().ToMethod(c=>new IFoo[]
        {
          c.Kernel.Get<FooType1>(),
          c.Kernel.Get<FooType2>(),
           ...
        });
      }
   }

   // Injection target
   public class InjectedClass {
      public InjectedClass(IReadOnlyList<IFoo> foos) { ;}
   }

我同意,仅指定将来的版本将保留声明顺序是一个更好的解决方案,但是这种解决方法有效。

我本想在上下文c中创建子对象c,所以Get会知道它已被注入InjectedClass中,但是我不知道该怎么做。