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



有人知道如何通过autofac:填充此属性吗

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

有这两个具体的实现:

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

奇怪的是,下面的代码工作得很好,我在集合中得到了两个项目,它们都实现了ITestTransactionProcessor:

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

注意:

IEnumerable<ITransactionProcessor<TransactionBase>>

对比:

IEnumerable<ITestTransactionProcessor>

autofac版本为2.4.4(如果有任何不同的话)。

我可以提供更多的代码/细节,但我认为这会给我一个很好的想法,我正在努力实现什么。

背景是我们为客户加载一个交易列表,我们需要计算客户账户的余额。我们希望有一组处理器(每个事务类型一个),它们将事务和摘要对象作为输入,并输出摘要对象的更新版本,该更新版本通过计算一个客户余额所需的所有处理器传递。因此,我们加载客户、他的交易,并在每个交易中循环,并调用工厂对象来为给定的交易获取处理器,一旦我们有了处理器,我们就去:

state = processor.Process(transaction, state);

直到我们处理完所有交易。那么我们应该有平衡。不幸的是,autofac没有加载处理器,因此工厂对每个事务类型都返回null:/

提前感谢,卢卡斯

您需要确保ITransactionProcessor<T>已将T标记为反变体,即:

interface ITransactionProcessor<in T> { ... }

然后,在Autofac:中启用反向解析

builder.RegisterSource(new ContravariantRegistrationSource());

最新更新