2013-03-14 59 views
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会如何实现?

回答

-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。

+0

你确实可以gister使用Unity开放泛型,但使用了不同的语法,如我的答案所示。你没有语法糖,但你可以做到。 – JotaBe 2016-06-28 08:43:26

0

你可以这样注册开仿制药与统一:

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

然后你就可以解决这些问题是这样的:

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

什么你不能做的是使用这将是“明显”的语法:

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