2016-10-06 2 views
1

Я пытаюсь зарегистрировать следующую комбинацию в простом Injector:Как зарегистрировать коллекцию условно с помощью простого инжектора?

  1. Коллекция (один или более) реализации IMyInterface для конкретного типа, например, Implementation1<MyClass> и Implementation2<MyClass> для IMyInterface<MyClass>
  2. коллекции пустышки (пустой список) для открытых общего типа IMyInterface<T> как откат (условных?)

Таким образом, я хочу, чтобы убедиться, что все запрашивающие из IEnumerable<IMyInterface<T>> получит в наименее пустой список или список реальных реализаций; запросчик IEnumerable<IMyInterface<MyClass>> должен получить перечисляемый экземпляр (например, List<IMyInterface<MyClass>>) с элементами Implementation1<MyClass> и Implementation2<MyClass>, а запросчик IEnumerable<IMyInterface<AnotherClass>> должен получить Enumerable.Empty<IMyInterface<AnotherClass>>.

Список классов не указан в регистрационном коде. Я реализовал загрузчик, собирающий все реализации из сборок.

Я пробовал использовать несколько комбинаций RegisterCollection и RegisterConditional, но никто не выполнил все требования. Есть ли работа для (не существует) RegisterCollectionConditional?

+0

Связанный: https://github.com/simpleinjector/SimpleInjector/issues/283 – Steven

+0

Можете ли вы объяснить (или показать), какие условия для реализаций будут отображаться в коллекции или нет? – Steven

+0

Без этой информации невозможно дать вам хороший ответ. – Steven

ответ

1

Что вы хотите сделать, не требует ничего особенного в Simple Injector; Простой инжектор будет автоматически выберите любой назначаемый тип для вас. Если предположить, что следующие типы:

class Implementation1 : IMyInterface<MyClass> { } 
class Implementation2 : IMyInterface<MyClass> { } 
class Implementation3 : IMyInterface<FooBarClass>, IMyInterface<MyClass> { } 

Регистрация будет выглядеть следующим образом:

container.RegisterCollection(typeof(IMyInterface<>), new[] { 
    typeof(Implementation1), 
    typeof(Implementation2), 
    typeof(Implementation3), 
}); 

Это приведет к следующему:

// returns: Implementation1, Implementation2, Implementation3. 
container.GetAllInstances<IMyInterface<MyClass>>(); 

// returns: Implementation3. 
container.GetAllInstances<IMyInterface<FooBarClass>>(); 


// returns: empty list. 
container.GetAllInstances<IMyInterface<AnotherClass>>(); 

Вместо регистрации всех типов вручную, вы можете также использование серийной регистрации:

container.RegisterCollection(typeof(IMyInterface<>), 
    typeof(Implementation1).Assembly); 

Это зарегистрирует все реализации (при условии, что они все находятся в одной сборке).

В случае, однако у вас есть следующие типы:

class Implementation1<T> : IMyInterface<T> { } 
class Implementation2<T> : IMyInterface<T> { } 
class Implementation3<T> : IMyInterface<T> { } 

Вы можете сделать следующую регистрацию:

container.RegisterCollection(typeof(IMyInterface<>), new[] { 
    typeof(Implementation1<MyClass>), 
    typeof(Implementation2<MyClass>), 
    typeof(Implementation3<MyClass>), 
    typeof(Implementation3<FooBarClass>), 
}); 

Эта регистрация приведет к тому же результату, что мы видели раньше:

// returns: Implementation1<MyClass>, Implementation2<MyClass>, Implementation3<MyClass>. 
container.GetAllInstances<IMyInterface<MyClass>>(); 

// returns: Implementation3<FooBarClass>. 
container.GetAllInstances<IMyInterface<FooBarClass>>(); 

// returns: empty list. 
container.GetAllInstances<IMyInterface<AnotherClass>>(); 

Для получения дополнительной информации см. collections section и generic collections section в документации.