Generics 如何将泛型接口注册到泛型实现

Generics 如何将泛型接口注册到泛型实现,generics,inversion-of-control,unity-container,munq,Generics,Inversion Of Control,Unity Container,Munq,在Unity中,我能够轻松地将通用接口映射到通用实现,这样,对于所有的事情,我都可以通过一次注册映射某个MPL var container = new UnityContainer(); //Map all generic repositories to their concrete generic implementations. container.RegisterType( typeof(IRepository<,>),

在Unity中,我能够轻松地将通用接口映射到通用实现,这样,对于所有的事情,我都可以通过一次注册映射某个MPL

var container = new UnityContainer();
//Map all generic repositories to their concrete generic implementations.
container.RegisterType(
                       typeof(IRepository<,>), 
                       typeof(Repository<,>)
                      ); 
var EmployeeRepository = container.Resolve<IRepository<Employee, int>>();

在Munq如何实现同样的目标?

你运气不好。您有两个选择:

明确注册所有类型:

容器。登记; 容器。登记; 容器。登记; //等 您可以随时制作一个方便的助手方法来减轻一些痛苦:

公共静态无效注册表存储库 这个集装箱 { 容器。登记; container.RegisterRepository>; container.RegisterRepository>; //等 切换到另一个内置支持开放泛型的容器。据我所知,这些容器支持开放泛型:Autofac、StructureMap、Unity、Castle Windsor、Ninject和Simple Injector


您可以使用Unity注册开放泛型,如下所示:

container.RegisterType(typeof(IOpenGeneric<>), typeof(OpenGeneric<>));
IOpenGeneric<MyClass> value = container.Resolve<IOpenGeneric<MyClass>>();
然后您可以这样解决它们:

container.RegisterType(typeof(IOpenGeneric<>), typeof(OpenGeneric<>));
IOpenGeneric<MyClass> value = container.Resolve<IOpenGeneric<MyClass>>();
您不能使用以下明显的语法:

container.RegisterType<IOpenGeneric<T>,OpenGeneric<T>>() // SYNTAX ERROR!!

您确实可以使用Unity注册开放泛型,但使用不同的语法,如我的回答所示。您没有语法糖,但您可以做到。