2014-02-05 3 views
1

Мой вопрос действительно повторение старого вопроса разместил здесь: Ninject 2.2 multiple bindingsNinject 3 несколько привязок

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

EDIT

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

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

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

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

Kernel.Bind<IDbContextFactory>().To<DbContextFactory>().InSingletonScope(); 

Здесь IDbContextFactory также IDependency, поэтому он загрузился уже основной библиотекой, и теперь я зарегистрирую его здесь, но с другим объемом (singleton).

Из опыта (и проверив его ранее) Я знаю, что это не проблема в Autofac, но Ninject дает мне это сообщение об ошибке, уже зарегистрировав его.

В идеале было бы лучше просто отменить все предыдущие регистрации ... «каскадный стиль» (за неимением лучшего выражения) ..

+0

Насколько я знаю, вы не можете «переопределить регистрацию каскадного стиля» - по крайней мере, не легко. Однако мне интересно, что такое значение 'IDependency'. Для чего используется этот интерфейс? Я подозреваю, что вы можете легко решить проблему, используя другой дизайн - без усложнения всего программного обеспечения. – BatteryBackupUnit

ответ

0

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>>(); 

Works.

Однако, если вы не говорите об открытых общих привязках, ninject 3 по-прежнему обрабатывает множественные привязки так же, как и ninject 2.2.

В большинстве сценариев вы можете обойти это, используя контекстные привязки. Хорошо, я бы точно не назвал это обходным решением, я бы назвал его хорошим дизайном. В целом это описано здесь: https://github.com/ninject/ninject/wiki/Contextual-Binding

Простым способом было бы указать привязку с использованием имени. Для этого требуется одно связывание для указанного и разрешено только одно. См: https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-constrained-resolution-named-bindings

Также можно определить "по умолчанию" сковывающий как .Bind<IFoo>().To<Foo>(); и специальный случай привязок с синтаксисом .When(...), как:

.Bind<IFoo>().To<SpecialFoo>().When(ctx => ...)

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

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

+0

Спасибо, см. Мое редактирование – Matt

Смежные вопросы