StructureMap 在支持开放泛型方面非常有限。和简易注射器 https://simpleinjector.org/另一方面,您可以执行以下操作:
// using SimpleInjector.Extensions;
container.RegisterOpenGeneric(typeof(IParser<>), typeof(RangeParser<>));
这将映射IParser<Range<T>>
to RangeParser<T>
where T
is a struct
。如果您有多个通用实现IParser<T>
您可以简单地添加额外的实现:
container.RegisterOpenGeneric(typeof(IParser<>), typeof(RangeParser<>));
container.RegisterOpenGeneric(typeof(IParser<>), typeof(ReferenceTypeParser<>));
您唯一需要确保的是注册不重叠。当您尝试解析(或注入)已关闭的对象时,简单注入器将抛出异常IParser<T>
可以通过多个注册处理的类型。
如果存在一些重叠,您可以为RegisterOpenGeneric
像这样的方法:
container.RegisterOpenGeneric(typeof(IParser<>), typeof(RestrictiveParser<>));
container.RegisterOpenGeneric(typeof(IParser<>), typeof(FallbackParser<>),
c => !c.Handled);
这些注册将按注册顺序进行评估。
您可以使用泛型类型约束作为自然过滤器,简单注入器将遵循它们。如果泛型类型约束不能解决问题,您始终可以注册部分开放泛型类型:
container.RegisterOpenGeneric(typeof(IParser<>),
typeof(SomeParser<>).MakeGenericType(typeof(List<>));
在所有 .NET IoC 框架中,Simple Injector 对泛型类型的支持最好:
- 它理解泛型类型约束。
- 它允许复杂的嵌套泛型类型映射。
- 它允许提供部分开放的泛型类型。
- 它允许将通用装饰器应用于类型。
- 它允许根据泛型类型约束有条件地应用泛型装饰器。
- 它允许注册集合,其中混合了非泛型实现和所提供的开放泛型类型的自动确定的封闭版本。