1

在 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 中实现相同的目标?

4

2 回答 2

1

您可以像这样使用 Unity 注册开放泛型:

container.RegisterType(typeof(IOpenGeneric<>), typeof(OpenGeneric<>));

然后你可以像这样解决它们:

IOpenGeneric<MyClass> value = container.Resolve<IOpenGeneric<MyClass>>();

您不能做的是使用“明显”的语法:

container.RegisterType<IOpenGeneric<T>,OpenGeneric<T>>() // SYNTAX ERROR!!
于 2016-06-28T08:39:03.017 回答
-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
    
  2. 切换到具有对开放泛型的内置支持的不同容器。以下是我所知道的支持此功能的容器:Autofac、StructureMap、Unity、Castle Windsor、Ninject 和 Simple Injector。

于 2013-03-14T21:20:55.797 回答