как зарегистрировать коллекцию универсальных интерфейсов в autofac - PullRequest
2 голосов
/ 19 января 2012

Кто-нибудь знает, как заполнить это свойство с помощью 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>

Версия с автоматическим кодом - 2.4.4 (еслиэто имеет какое-то значение).

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

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

state = processor.Process(transaction, state);

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

Заранее спасибо, Lukasz

1 Ответ

2 голосов
/ 20 января 2012

Необходимо убедиться, что ITransactionProcessor<T> имеет T, помеченный как контравариантный, то есть:

interface ITransactionProcessor<in T> { ... }

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

builder.RegisterSource(new ContravariantRegistrationSource());
...