在Unity中,我能够轻松地将通用接口映射到通用实现,这样对于所有ISomething,我可以通过单个注册映射SomethingImpl。
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完成同样的工作?
答案 0 :(得分:0)
您可以使用Unity注册开放式泛型:
container.RegisterType(typeof(IOpenGeneric<>), typeof(OpenGeneric<>));
然后你可以像这样解决它们:
IOpenGeneric<MyClass> value = container.Resolve<IOpenGeneric<MyClass>>();
你不能做的是使用哪种“明显”的语法:
container.RegisterType<IOpenGeneric<T>,OpenGeneric<T>>() // SYNTAX ERROR!!
答案 1 :(得分:-1)
你运气不好。您有两种选择:
明确注册所有类型:
container.Register<IRepository<int, User>, Repository<int, User>>();
container.Register<IRepository<Guid, Order>, Repository<Guid, Order>>();
container.Register<IRepository<long, OrderLine>, Repository<long, OrderLine>>();
// etc
你总能找到一个方便的辅助方法来减轻疼痛:
public static void RegisterRepository<TKey, TEntity>(
this Container container)
{
container.Register<IRepository<TKey, TEntity>, Repository<TKey, TEntity>();
}
container.RegisterRepository<int, User>>();
container.RegisterRepository<Guid, Order>>();
container.RegisterRepository<long, OrderLine>>();
// etc
切换到内置支持开放式泛型的其他容器。这些是我所知道的支持它的容器:Autofac,StructureMap,Unity,Castle Windsor,Ninject和Simple Injector。