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