2017-08-03 108 views
-1

怎么样,我有几个类实现了ICommanHandler接口多次,因为我可以使用Unity自动注册它们,而不是一个一个地注册它们。谢谢。Unity自动注册ICommandHandler

public class CarCommandHandler:ICommandHandler<CreateCar> 
           ICommandHandler<DeleteCar> 
{ 
    ...... 
} 


public class EngineCommandHandler:ICommandHandler<CreateEngine> 
            ICommandHandler<DeleteEngine> 
{ 
    ...... 
} 



public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<ICommandHandler<CreateCar>, CarCommandHandler>(); 

    container.RegisterType<ICommandHandler<DeleteCar>, CarCommandHandler>(); 

    container.RegisterType<ICommandHandler<CreateEngine>, EngineCommandHandler>(); 

    container.RegisterType<ICommandHandler<DeleteEngine>, EngineCommandHandler>(); 
} 
+0

你尝试'container.RegisterType(typeof运算(ICommandHandler <>) ,CarCommandHandler,“firstRegistration”); container.RegisterType(typeof(ICommandHandler <>),EngineCommandHandler,“secondRegistration”);'? –

+0

RegisterType接受的参数不匹配:0 –

+0

是的,小错误,检查它:'你试过container.RegisterType(typeof(ICommandHandler <>),typeof(CarCommandHandler),“firstRegistration”); container.RegisterType(typeof(ICommandHandler <>),typeof(EngineCommandHandler),“secondRegistration”);' –

回答

0

您需要遍历所有实现ICommandHandler<>的类型并注册它们。代码如下可以这样做:

public static void RegisterAllImplementations(this UnityContainer container, Type openInterfaceType) 
    { 
     int registerCount = 0; 
     // Iterate all types from current assembly 
     foreach (var typeItem in Assembly.GetExecutingAssembly().GetTypes()) 
     { 
      foreach (var interaceItem in typeItem.GetInterfaces()) 
      { 
       if (interaceItem.IsGenericType && interaceItem.GetGenericTypeDefinition() == openInterfaceType) 
       { 
        container.RegisterType(interaceItem, typeItem, $"{registerCount++}"); 
       } 
      } 
     } 
    } 

的调用:

var container = new UnityContainer(); 
    container.RegisterAllImplementations(typeof(ICommandHandler<>)); 

让我知道,如果事情不工作

+0

它的作品完美,非常感谢你! –