代码之家  ›  专栏  ›  技术社区  ›  Matias Sala

Unity自动注册ICommandHandler

  •  -1
  • Matias Sala  · 技术社区  · 8 年前

    那么,我有几个类实现了ICommanHandler<&燃气轮机;接口多次,因为我可以使用Unity自动注册它们,而不是逐个注册。非常感谢。

    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>(); 
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   George Alexandria    8 年前

    您需要迭代实现的所有类型 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<>));