2

DI コンテナーに SimpleInjector を使用しています。2 つの型引数を持つオープン ジェネリック インターフェイスがあります。

public interface IAdapter<TRepository, TEntity>
    where TRepository : AbstractRepository
    where TEntity : AbstractModel, new()
{
}

コンテナーに次のように登録します。

container.RegisterOpenGeneric(typeof(IAdapter<,>), 
    typeof(Adapter<,>));

提供されたタイプに応じて IAdapter を装飾したいと思います。例(このコードが無効であることはわかっていますが、私がやろうとしていることを示しています)

class RepositoryX : AbstractRepository { }
class RepositoryY : AbstractRepository { }
class RepositoryZ : AbstractRepository { }

container.RegisterDecorator(typeof(IAdapter<RepositoryY,>), 
    typeof(SpecificAdapterDecorator<,>));

container.RegisterDecorator(typeof(IAdapter<[RepositoryX|RepositoryZ],>), 
    typeof(GeneralAdapterDecorator<,>));

これを行う方法はありますか?

4

1 に答える 1

2

一般的なデコレータのドキュメントから:

RegisterDecoratorそのデコレータを特定のサービス タイプに適用する必要があるかどうかを判断する述語を指定できるようにする availableのオーバーロードがあります。特定のコンテキストを使用して、デコレータを適用する必要があるかどうかを判断できます。

したがって、次のようなものが必要になります。

container.RegisterDecorator(
    typeof(IAdapter<,>), 
    typeof(SpecificAdapterDecorator<,>), 
    c => c.ServiceType.GetGenericArguments()[0] == typeof(RepositoryY));

container.RegisterDecorator(
    typeof(IAdapter<,>), 
    typeof(GeneralAdapterDecorator<,>), 
    c => c.ServiceType.GetGenericArguments()[0] != typeof(RepositoryY));
于 2012-12-28T18:50:56.230 に答える