многократные привязки недействительных гарантируют, чтобы поддерживать их порядок связывания - PullRequest
7 голосов
/ 21 октября 2011

Если я зарегистрируюсь:

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

И затем получу по:

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

Гарантирую ли я, что привязки всегда будут возвращены в таком порядке?

Я попробовал, и, похоже, так оно и есть, но это может быть чисто случайным.

Ответы [ 2 ]

6 голосов
/ 21 октября 2011

Краткий ответ: Нет, не так!

Немного более длинный ответ: текущая реализация сохраняет порядок. Но это не гарантируется, что это будет иметь место в будущих версиях Ninject. Также у вас не должно быть таких бизнес-правил в конфигурации контейнера IoC.

0 голосов
/ 25 мая 2019

Я нашел способ сделать упорядоченные мульти-привязки, потому что мне это тоже нужно:

(по общему признанию, очень похоже на мой ответ здесь: 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, но я не мог понять, как это сделать.

...