如何在Simple Injector中注册两种类型的泛型?

时间:2015-03-19 22:28:54

标签: c# asp.net-mvc asp.net-mvc-3 generics simple-injector

这是我的界面和类:

 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以使用包含多个类型的泛型?

1 个答案:

答案 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是运行时值,您不应该在服务的构造函数中注入此运行时值。使用工厂只会移动问题,因为在工厂内部仍然会将运行时值注入服务的构造函数中。这会破坏依赖关系图,并阻止您从verifyingdiagnosing对象图。

在这种情况下,我建议只需将ModelState传递给服务方法。