これは可能ですか?はいといいえ :-)
typeof(DatabaseMapper<,OracleException>)
は有効な C# コードではありません。すべてのジェネリック型引数を指定するか、まったく指定しないかのいずれかです。したがって、欠落している型引数を でContainer
埋める必要があることを に通知する方法はありません。いいえ、これはできません。TException
OracleException
しかし、はい、もちろんこれを行うことができます:-)。登録でその型OracleExceptionDatabaseMapper<T>
を継承して使用するクラスを作成するだけです。DatabaseMapper<T, OracleException>
// Helper class
public class OracleExceptionDatabaseMapper<T>
: DatabaseMapper<T, OracleException>
{
}
// Registration
container.RegisterOpenGeneric(typeof(IDatabaseMapper<>),
typeof(OracleExceptionDatabaseMapper<>));
このようにして、特定の実装にはジェネリック型が 1 つしかなく、それを特定のサービス インターフェイスの単一のジェネリック型引数にマップできます。
アップデート
Simple Injector 2.4 以降、部分的なオープン ジェネリック型を登録することが可能になりましたが、これは C# ではまだサポートされていないため、次のように部分的なオープン ジェネリック型を手動で作成する必要があります。
Type databaseMapperType = typeof(DatabaseMapper<,>).MakeGenericType(
typeof(DatabaseMapper<,>).GetGenericArguments().First(),
typeof(OracleException));
container.RegisterOpenGeneric(typeof(IDatabaseMapper<>), databaseMapperType);