执行分配给类和属性的 Unity 处理程序属性时的顺序差异
本文关键字:属性 程序 顺序 处理 Unity 分配 执行 | 更新日期: 2023-09-27 18:35:45
我在Unity v2.1中为我的Inteception管道使用了3个属性。一切都在正常发射,它们只是顺序错误。
在所有 3 个属性中,我确保我从属性中传递相应的处理程序的顺序。
因此,如果我在下面的TestClass.TestProperty上调用setter,我希望调用处理程序应该按以下顺序调用:验证,事务,通知。我看到的是通知,交易,验证。
我这里有 2 个问题,我找不到使用谷歌搜索的答案。
- 在我的设置TestClass.TestProperty的例子中,是否应该先调用属性属性,然后再调用类属性?还是应该尊重我的命令?
如果首先调用 2 个属性处理程序,我应该看不到通知、事务。如果我覆盖交易和通知订单默认值分别为 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)]
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;
}
}
我将 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;
}
}
当我运行此代码时,我看到:
验证!
交易!
通知!
如果我将验证属性构造函数的顺序参数更改为 9 ([Validation(9)]
),那么我看到验证按预期最后发生。