如何在autofac中注册通用接口的集合

时间:2012-01-19 18:46:55

标签: generics collections ienumerable autofac resolve

有没有人知道如何通过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不会加载处理器,因此工厂为每种事务类型返回null:/

提前致谢, 卢卡斯

1 个答案:

答案 0 :(得分:2)

您需要确保ITransactionProcessor<T>T标记为逆变,即:

interface ITransactionProcessor<in T> { ... }

然后,在Autofac中启用逆变解析:

builder.RegisterSource(new ContravariantRegistrationSource());