如何将通用接口注册到通用实现

时间:2013-03-14 17:29:10

标签: generics inversion-of-control unity-container munq

在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完成同样的工作?

2 个答案:

答案 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)

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

  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。