#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))
Но напомните, чтобы получить доступ к ядру только из конфигурации (например, фабрики, принадлежащие конфигурации)