Получить другой объект из Ninject в зависимости от ConstructorArgument

#c# #dependency-injection #ninject #ninject-2

#c# #зависимость-внедрение #ninject #ninject-2

Вопрос:

У меня есть следующий код:

 kernel.Get<IFoo>(new ConstructorArgument("rule", myRule))
  

Я хочу, чтобы я получал разные объекты в зависимости от значения в myRule. Как мне это сделать?
Что-то вроде этого psedocode

 Bind<IFoo>().To<Foo1>().When(x=>x.Parameters[0].Value.Type=="type1")
Bind<IFoo>().To<Foo2>().When(x=>x.Parameters[0].Value.Type=="type2")
  

где Type является членом myRule

Ответ №1:

Получить доступ к типу аргументов конструктора непросто. Возможно, вы захотите вместо этого использовать либо именованные привязки, либо метаданные и ограничения.

 Bind<IFoo>().To<Foo1>().WithMetadata("Type", typeof(MyRule1))
kernel.Get<IFoo>(m => m.Get<Type>("Type", null) == typeof(myRule), ConstructorArgument("rule", myRule))
  

Но напомните, чтобы получить доступ к ядру только из конфигурации (например, фабрики, принадлежащие конфигурации)