私はデコレータパターンを使用して、リポジトリのキャッシュを実装しています。
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
。私は何が欠けていますか?何か案は?