Ninject 3 множественных привязок
Мой вопрос действительно повторяет старый вопрос, опубликованный здесь: Ninject 2.2 множественные привязки
Кажется, кто-то собирался разобраться с этим еще в 2011 году. Кто-нибудь знает, есть ли способ отключить такие предупреждения в Ninject? Или какой-то другой обходной путь?
РЕДАКТИРОВАТЬ
В ответ на @BatteryBackupUnit, вот моя точная проблема:
У меня есть несколько библиотек... и в своей основной библиотеке я делаю что-то вроде этого:
- Найти все сборки, на которые ссылается приложение хоста (включая хост)
- Найти все типы, наследующие от
IDependency
из всех этих собраний. - Автоматически зарегистрировать все из них как переходные
Затем из другой библиотеки (на которую может или не может ссылаться приложение хоста), у меня есть это:
Kernel.Bind<IDbContextFactory>().To<DbContextFactory>().InSingletonScope();
Вот IDbContextFactory
также IDependency
поэтому он уже загружен основной библиотекой, и теперь я регистрирую его здесь, но с другой областью действия (синглтон).
По своему опыту (и тестированию ранее) я знаю, что это не проблема в Autofac, но Ninject выдает мне это сообщение об ошибке после того, как оно уже зарегистрировано.
В идеале было бы лучше переопределить любые предыдущие регистрации... "каскадный стиль" (из-за отсутствия лучшей фразы)..
1 ответ
Ninject теперь поддерживает переопределение открытых общих привязок с более конкретными. Например:
public interface IFoo<T> { }
public class Foo<T> : IFoo<T> { }
public class StringFoo : IFoo<string> {}
используется как:
var kernel = new StandardKernel();
kernel.Bind(typeof(IFoo<>)).To(typeof(Foo<>));
kernel.Bind<IFoo<string>>().To<StringFoo>();
var intFooInstance = kernel.Get<IFoo<int>>();
var stringFooinstance = kernel.Get<IFoo<string>>();
Работает.
Однако, если вы не говорите об открытых общих привязках, ninject 3 по-прежнему обрабатывает множественные привязки так же, как ninject 2.2.
В большинстве сценариев вы можете обойти это, используя контекстные привязки. Хорошо, я бы не назвал это обходным путем, я бы назвал это хорошим дизайном. В целом это описано здесь: https://github.com/ninject/ninject/wiki/Contextual-Binding
Простой способ - указать привязку, используя имя. Это требует одного связывания для указанного и допускает только одно. Смотрите: https://github.com/ninject/ninject/wiki/Contextual-Binding
Также возможно определить привязку "по умолчанию", например .Bind<IFoo>().To<Foo>();
и в особых случаях привязки с .When(...)
синтаксис, например:
.Bind<IFoo>().To<SpecialFoo>().When(ctx => ...)
Если вы покажете нам свою конкретную проблему, мы сможем предложить более конкретное решение.