这是我的界面和类:
public interface IServiceFactory<T, Y> where T : class where Y : class
{
T Create(ModelStateDictionary modelState);
}
public class ServiceFactory<T, Y> : IServiceFactory<T, Y>
where T : class
where Y : class
{
public T Create(ModelStateDictionary modelState)
{
var x = (T) Activator.CreateInstance(typeof (Y), new ModelStateWrapper(modelState));
return x;
}
}
Simple Injector的容器寄存器:
container.RegisterManyForOpenGeneric(typeof(IServiceFactory<, >), typeof(IServiceFactory<, >));
如何设置Simple Injector以使用包含多个类型的泛型?
答案 0 :(得分:7)
Register(Type, IEnumerable<Assembly>)
(v2中的RegisterManyForOpenGeneric
)允许进行批量注册。因此,一般来说,为Register
提供一个开放的泛型类型和一个或多个Assembly
实例,该方法将遍历程序集中的类型,并将注册所提供的泛型的所有非泛型实现类型。
您似乎想要的是将开放式通用抽象映射到开放式通用实现,以便在请求封闭式通用抽象时,返回封闭式通用实现。
这是这样做的方法:
// Simple Injector v3.x
container.Register(typeof(IServiceFactory<,>), typeof(ServiceFactory<,>));
// Simple Injector v2.x
container.RegisterOpenGeneric(typeof(IServiceFactory<,>), typeof(ServiceFactory<,>));
顺便说一句,我已经阅读了你之前提出的问题,你似乎对this question的答案有误导。应答者正确地指出ModelState
是运行时值,您不应该在服务的构造函数中注入此运行时值。使用工厂只会移动问题,因为在工厂内部仍然会将运行时值注入服务的构造函数中。这会破坏依赖关系图,并阻止您从verifying和diagnosing对象图。
在这种情况下,我建议只需将ModelState
传递给服务方法。