如果我注册:
Bind<IWeapon>().To<Sword>();
Bind<IWeapon>().To<Knife>();
Bind<IWeapon>().To<ChuckNorris>();
然后通过:
检索IEnumerable<IWeapon> weapons = ServiceLocator.Current.GetAllInstances<IWeapon>();
我保证绑定将始终以该顺序返回吗?
我尝试过,似乎确实如此,但这可能是偶然的。
答案 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中,但是我不知道该怎么做。