2012-01-19 3 views
2

Кто-нибудь знает, как получить эту собственность населенную autofac:как зарегистрировать коллекцию общих интерфейсов в autofac

public IEnumerable<ITransactionProcessor<TransactionBase>> TransactionHandlers { get; set; } 

с этими двумя конкретными реализациями:

public class FeeTransactionProcessor : ITransactionProcessor<FeeTransaction> 
public class InterestTransactionProcessor : ITransactionProcessor<InterestTransaction> 

Как ни странно, этот код работ хорошо, и я получаю 2 элемента в коллекции, которые оба реализуют ITestTransactionProcessor:

public IEnumerable<ITestTransactionProcessor> TestTransactionHandlers { get; set; } 

Примечание:

IEnumerable<ITransactionProcessor<TransactionBase>> 

против:

IEnumerable<ITestTransactionProcessor> 

версия autofac является 2.4.4 (если это делает никакой разницы).

Я могу предоставить больше кода/деталей, но я думал, что это даст хорошее представление о том, чего я пытаюсь достичь.

Фоном является то, что мы загружаем список транзакций для клиента, и нам нужно рассчитать остаток на счете клиентов. Мы хотели бы иметь набор процессоров (по одному на каждый тип транзакции), которые берут транзакцию и суммирующий объект в качестве входных данных и выплевывают обновленную версию объекта сводки, которая проходит через все процессоры, которые необходимы для расчета баланса для одного клиента. Таким образом, мы загружаем клиент, его операцию и проходные каждую операцию и вызов объекта фабрики, чтобы получить процессор для данной операции, и как только мы имеем процессор мы идем:

state = processor.Process(transaction, state); 

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

Спасибо заранее, Лукаша

ответ

2

Вы должны убедиться, что ITransactionProcessor<T> имеет T отмечен контрвариантные, а именно:

interface ITransactionProcessor<in T> { ... } 

Затем включите контравариантную решительность в Autofac:

builder.RegisterSource(new ContravariantRegistrationSource()); 
Смежные вопросы