2

このプロパティを autofac で設定する方法を知っている人はいますか?

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

これらの 2 つの具体的な実装を使用すると、次のようになります。

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 です (違いがある場合)。

より多くのコード/詳細を提供できますが、これにより、私が達成しようとしていることの良いアイデアが得られると思いました.

背景は、顧客のトランザクションのリストをロードし、顧客口座の残高を計算する必要があることです。トランザクションと集計オブジェクトを入力として受け取り、残高の計算に必要なすべてのプロセッサを通過する集計オブジェクトの更新バージョンを吐き出す一連のプロセッサ (各トランザクション タイプごとに 1 つ) が必要です。 1人の顧客のために。したがって、顧客、彼のトランザクションをロードし、各トランザクションをループし、ファクトリ オブジェクトを呼び出して、特定のトランザクションのプロセッサを取得します。プロセッサを取得したら、次のようにします。

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 に答える