C# 执行分配给类和属性的Unity HandlerAttribute时的顺序不同

C# 执行分配给类和属性的Unity HandlerAttribute时的顺序不同,c#,unity-container,unity-interception,C#,Unity Container,Unity Interception,在UnityV2.1中,我有3个属性用于我的Inteception管道。一切正常,只是顺序不对 在所有3个属性中,我都确保将属性中的顺序传递给相应的处理程序 因此,如果我调用下面TestClass.TestProperty上的setter,我希望调用处理程序应该按以下顺序调用:验证、事务、通知。我看到的是通知、事务、验证 我这里有两个问题,我无法找到使用谷歌搜索的答案 在我设置TestClass.TestProperty的示例中,是否假定先调用属性属性,然后再调用类属性?还是团结应该尊重我的命令

在UnityV2.1中,我有3个属性用于我的Inteception管道。一切正常,只是顺序不对

在所有3个属性中,我都确保将属性中的顺序传递给相应的处理程序

因此,如果我调用下面TestClass.TestProperty上的setter,我希望调用处理程序应该按以下顺序调用:验证、事务、通知。我看到的是通知、事务、验证

我这里有两个问题,我无法找到使用谷歌搜索的答案

  • 在我设置TestClass.TestProperty的示例中,是否假定先调用属性属性,然后再调用类属性?还是团结应该尊重我的命令
  • 如果首先调用2个属性处理程序,则我不应看到Notify、Transaction。如果我覆盖了事务,并且通知顺序分别默认为1和2,那么我将获得事务,并按预期通知。我的订单从1点开始有关系吗

    [AttributeUsage(AttributeTargets.Class)
    public class ValidationAttribute : HandlerAttribute
    {
      public ValidationAttribute(int order = 1)
      {
        Order = order
      }
      public override ICallHandler CreateHandler(IUnityContainer container)
      {
        var ValidationHandler = container.Resolve<ValidationHandler>();
        ValidationHandler.Order = Order;
      }
    }
    
    public class TransactionAttribute : HandlerAttribute
    {
      public TransactionAttribute (int order = 2)
      {
        Order = order
      }
    
      // Same CreateHandler as above resolving correct handler
    }
    
    public class NotifyAttribute : HandlerAttribute
    {
      public NotifyAttribute (int order = 3)
      {
        Order = order
      }
    
      // Same CreateHandler as above resolving correct handler
    }
    
    // Didn't include handler code to keep short(ish). All handlers have logging to show they are executing
    ...
    
    [Validation]
    public class TestClass
    { 
        public int TestProperty
        {
          get;
          [Transaction]
          [Notify]
          set;
        }
    }
    
    [AttributeUsage(AttributeTargets.Class)
    公共类ValidationAttribute:HandlerAttribute
    {
    公共验证属性(整数顺序=1)
    {
    订单=订单
    }
    公共重写ICallHandler CreateHandler(IUnityContainer容器)
    {
    var ValidationHandler=container.Resolve();
    ValidationHandler.Order=Order;
    }
    }
    公共类事务属性:HandlerAttribute
    {
    公共事务属性(整数顺序=2)
    {
    订单=订单
    }
    //与上面相同的CreateHandler解析正确的处理程序
    }
    公共类NotifyAttribute:HandlerAttribute
    {
    公共属性(整数顺序=3)
    {
    订单=订单
    }
    //与上面相同的CreateHandler解析正确的处理程序
    }
    //没有包含要保持简短的处理程序代码(ish)。所有处理程序都有日志记录以显示它们正在执行
    ...
    [验证]
    公共类TestClass
    { 
    公共int测试属性
    {
    得到;
    [交易]
    [通知]
    设置
    }
    }
    

  • 对我来说,它似乎以正确的顺序启动。以下是我的示例代码:

    [AttributeUsage(AttributeTargets.Class)]
    public class ValidationAttribute : HandlerAttribute
    {
        public ValidationAttribute(int order = 1)
        {
            Order = order;
        }
    
        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            var handler = container.Resolve<ValidationHandler>();
            handler.Order = Order;
            return handler;
        }
    }
    
    public class TransactionAttribute : HandlerAttribute
    {
        public TransactionAttribute(int order = 2)
        {
            Order = order;
        }
    
        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            var handler = container.Resolve<TransactionHandler>();
            handler.Order = Order;
            return handler;
        }
    }
    
    public class NotifyAttribute : HandlerAttribute
    {
        public NotifyAttribute(int order = 3)
        {
            Order = order;
        }
    
        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            var handler = container.Resolve<NotifyHandler>();
            handler.Order = Order;
            return handler;
        }
    }
    
    public class ValidationHandler : ICallHandler
    {
    
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            Console.WriteLine("Validation!");
            return getNext().Invoke(input, getNext);
        }
    
        public int Order
        {
            get;
            set;
        }
    }
    
    public class TransactionHandler : ICallHandler
    {
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            Console.WriteLine("Transaction!");
            return getNext().Invoke(input, getNext);
        }
    
        public int Order
        {
            get;
            set;
        }
    }
    
    public class NotifyHandler : ICallHandler
    {
        public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
        {
            Console.WriteLine("Notify!");
            return getNext().Invoke(input, getNext);
        }
    
        public int Order
        {
            get;
            set;
        }
    }
    
    [Validation]
    public class TestClass
    {
        public virtual int TestProperty
        {
            get;
            [Transaction]
            [Notify]
            set;
        }
    }
    
    [AttributeUsage(AttributeTargets.Class)]
    公共类ValidationAttribute:HandlerAttribute
    {
    公共验证属性(整数顺序=1)
    {
    订单=订单;
    }
    公共重写ICallHandler CreateHandler(IUnityContainer容器)
    {
    var handler=container.Resolve();
    handler.Order=订单;
    返回处理程序;
    }
    }
    公共类事务属性:HandlerAttribute
    {
    公共事务属性(整数顺序=2)
    {
    订单=订单;
    }
    公共重写ICallHandler CreateHandler(IUnityContainer容器)
    {
    var handler=container.Resolve();
    handler.Order=订单;
    返回处理程序;
    }
    }
    公共类NotifyAttribute:HandlerAttribute
    {
    公共属性(整数顺序=3)
    {
    订单=订单;
    }
    公共重写ICallHandler CreateHandler(IUnityContainer容器)
    {
    var handler=container.Resolve();
    handler.Order=订单;
    返回处理程序;
    }
    }
    公共类ValidationHandler:ICallHandler
    {
    公共IMethodReturn调用(IMethodInvoke输入,GetNextHandlereGate getNext)
    {
    Console.WriteLine(“验证!”);
    返回getNext().Invoke(输入,getNext);
    }
    公共秩序
    {
    得到;
    设置
    }
    }
    公共类TransactionHandler:ICallHandler
    {
    公共IMethodReturn调用(IMethodInvoke输入,GetNextHandlereGate getNext)
    {
    Console.WriteLine(“事务!”);
    返回getNext().Invoke(输入,getNext);
    }
    公共秩序
    {
    得到;
    设置
    }
    }
    公共类NotifyHandler:ICallHandler
    {
    公共IMethodReturn调用(IMethodInvoke输入,GetNextHandlereGate getNext)
    {
    Console.WriteLine(“通知”);
    返回getNext().Invoke(输入,getNext);
    }
    公共秩序
    {
    得到;
    设置
    }
    }
    [验证]
    公共类TestClass
    {
    公共虚拟属性
    {
    得到;
    [交易]
    [通知]
    设置
    }
    }
    
    我将TestProperty属性设置为虚拟,以便使用VirtualMethodInterceptor。以下是注册和测试代码:

    class Program
    {
        static void Main(string[] args)
        {
            IUnityContainer container = new UnityContainer();
            container.AddNewExtension<Interception>();
    
            container.RegisterType<ValidationHandler>(new ContainerControlledLifetimeManager());
            container.RegisterType<TransactionHandler>(new ContainerControlledLifetimeManager());
            container.RegisterType<NotifyHandler>(new ContainerControlledLifetimeManager());
    
            container.RegisterType<TestClass>(
                new InterceptionBehavior<PolicyInjectionBehavior>(),
                new Interceptor<VirtualMethodInterceptor>()); 
    
            var testClass = container.Resolve<TestClass>();
    
            testClass.TestProperty = 5;
        }
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    IUnityContainer容器=新的UnityContainer();
    container.AddNewExtension();
    RegisterType(新的ContainerControlledLifetimeManager());
    RegisterType(新的ContainerControlledLifetimeManager());
    RegisterType(新的ContainerControlledLifetimeManager());
    container.RegisterType(
    新的侦听行为(),
    新拦截器());
    var testClass=container.Resolve();
    testClass.TestProperty=5;
    }
    }
    
    运行此代码时,我看到:

    验证!
    交易!
    通知


    如果我将ValidationAttribute构造函数的order参数更改为9(
    [Validation(9)]
    ),那么我会看到验证按预期在最后进行。

    是因为我,还是使用“order=order”似乎不是正确的命名用法。属性顺序(大写为O)是Unity中基类HandlerAttribute的属性。小写类参数是我们使用的编码标准。这是我认为已经实现的,但在我的重构中似乎出现了一些错误。首先,我有默认的Notify被覆盖,并一直设置为Order=1…Doh!!!其次,它看起来像我的Validation调用处理程序从未调用“getNext().Invoke(input,getNext)”,因此无论优先级如何,它总是放在底部。我正在处理一些遗留代码,他们在其中实现了两种调用方式。“IMethodReturn Invoke(IMethodInvoke input,GetNextHandleredLegate getNext)”和“void Invoke(IMethodInvoke input,GetNextHandleredLegate getNext)”“验证wa