2

有谁知道如何让这个属性由 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 :/

在此先感谢,卢卡斯

4

1 回答 1

2

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

interface ITransactionProcessor<in T> { ... }

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

builder.RegisterSource(new ContravariantRegistrationSource());
于 2012-01-20T15:04:03.597 回答