3

私はデコレータパターンを使用して、リポジトリのキャッシュを実装しています。

IFooRepository()
IFooRepository FooRepository()
IFooRepository CachedFooRepository(IFooRepository fooRepository)

Cached リポジトリは要求されたオブジェクトのキャッシュをチェックし、存在しない場合は FooRepository を呼び出して取得および保存します。現在、次の方法を使用して、これらのタイプを StructureMap に登録しています。

For<IFooRepository>().Use<CachedFooRepository()
    .Ctor<IFooRepository>().Use<FooRepository>();

これは問題なく機能しますが、キャッシュされたリポジトリの数が増えるにつれて、それぞれを個別に登録するのは扱いにくくなり、エラーが発生しやすくなります。共通の規則があるので、カスタムの IRegistrationConvention を使用してアセンブリをスキャンしようとしていますが、FooRepository を関数内の CachedFooRepository のコンストラクターに渡す方法がわかりませんvoid Process(Type type, Registry registry)

次のようなことをする例を見つけました:

Type interfaceType = type.GetInterface(type.Name.Replace("Cached", "I"));
registry.AddType(interfaceType, type);

また

Type interfaceType = type.GetInterface(type.Name.Replace("Cached", "I"));
registry.For(interfaceType).Use(type);

しかし、どちらの方法でも を連鎖させることはできません.Ctor。私は何が欠けていますか?何か案は?

4

0 に答える 0