2015-05-26 2 views
0

поэтому у меня проблема с получать все экземпляры классов, которые реализуют общий интерфейс прийти через в моем конструктореNinject конвенции инъекционные многократного связывания конструктор

Я использую

kernel.Bind(x => x.FromThisAssembly().SelectAllClasses() 
        .InheritedFrom(typeof(IRepository<>)).BindAllInterfaces()); 

У меня есть тест, который проходит, когда я спрашиваю для конкретного хранилища

var booking = kernel.Get<BookingRepository>(); 
Assert.IsNotNull(booking); 

, но я создал класс, который принимает

ICollection<IRepository<EntityBase>> repositories, 

где EntityBase является абстрактным классом, что все мои объекты наследуют от и я не получаю ничего назад и испытание

var rep = kernel.GetAll<IRepository<EntityBase>>(); 

не содержит ничего, когда я утверждаю, что он содержит что-то с помощью .any()

, если я вручную добавить сопоставление

kernel.Bind<IRepository<EntityBase>>().To<BookingRepository>(); 

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

Может ли я получить все репозитории инъекционных в конструктор с помощью

ICollection<IRepository<EntityBase>> 
+0

Всегда ли верно, что IRepository можно назначить IRepository ? – treze

+0

Да, у меня есть тип сущности и тип ценностного типа – scaifyuk

ответ

0

Вы должны создать свою собственную логику, чтобы определить, какие типы связываться с:

kernel.Bind(x => x.FromThisAssembly() 
    .SelectAllClasses() 
    .InheritedFrom(typeof(IRepository<>)) 
    .BindSelection(this.SelectDefaultInterfaceAndRepositoryBaseInterface)); 

private IEnumerable<Type> SelectDefaultInterfaceAndRepositoryBaseInterface(
    Type t, 
    IEnumerable<Type> baseTypes) 
{ 
    yield return baseTypes.Single(x => 
            x.IsGenericType 
            && x.GetGenericTypeDefinition() == typeof(IRepository<>)); 

    yield return typeof(IRepository<EntityBase>); 
} 

У меня есть запустить код и ItWorksTM (включая ctor-injection ICollection<IRepository<EntityBase>>)

+0

Спасибо, что сработало отлично, только пожелал, чтобы я задал этот вопрос на несколько дней раньше, чем тратил время на поиски ответа – scaifyuk

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