这可能吗?是和不是:-)
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);