Ninject 3 множественных привязок

Мой вопрос действительно повторяет старый вопрос, опубликованный здесь: Ninject 2.2 множественные привязки

Кажется, кто-то собирался разобраться с этим еще в 2011 году. Кто-нибудь знает, есть ли способ отключить такие предупреждения в Ninject? Или какой-то другой обходной путь?

РЕДАКТИРОВАТЬ

В ответ на @BatteryBackupUnit, вот моя точная проблема:

У меня есть несколько библиотек... и в своей основной библиотеке я делаю что-то вроде этого:

  1. Найти все сборки, на которые ссылается приложение хоста (включая хост)
  2. Найти все типы, наследующие от IDependency из всех этих собраний.
  3. Автоматически зарегистрировать все из них как переходные

Затем из другой библиотеки (на которую может или не может ссылаться приложение хоста), у меня есть это:

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 => ...)

См. Https://github.com/ninject/ninject/wiki/Contextual-Binding#specif ying-constraints-on-the-type-binding-using-arbitrary-elements-of-the-resolution-request-context

Если вы покажете нам свою конкретную проблему, мы сможем предложить более конкретное решение.

Другие вопросы по тегам