我在一个类中有一个方法,我想拦截如下:
[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()
使用时如何将订单值注入ICallHandler.Order
属性CustomAttributeMatchingRule
?
我不希望订单被硬编码到处理程序本身或注册时。我希望它是方法注释的 Order 属性的变量。
我在一个类中有一个方法,我想拦截如下:
[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()
使用时如何将订单值注入ICallHandler.Order
属性CustomAttributeMatchingRule
?
我不希望订单被硬编码到处理程序本身或注册时。我希望它是方法注释的 Order 属性的变量。
我已经使用 HandlerAttribute 实现了这一点 - 通常我在 Unity 中使用它来进行属性样式拦截只是因为您不必费心手动创建策略 - 相反,您只需将 HandlerAttribute 应用于您的代码,Unity 将自动创建一个给你的政策。
无论如何,这样的事情可能就是你所追求的。首先像往常一样定义一个调用处理程序,除了参数化它:-
public class MyCallHandler : ICallHandler
{
public MyCallHandler(Int32 value)
{
Order = value;
}
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine("Parameterised call handler!");
return getNext()(input, getNext);
}
public int Order { get; set; }
}
现在不要使用 CustomTagAttribute,而是使用 HandlerAttribute:-
public class MyHandler : HandlerAttribute
{
private readonly Int32 value;
public MyHandler(Int32 value)
{
this.value = value;
}
public override ICallHandler CreateHandler(IUnityContainer container)
{
return new MyCallHandler(value);
}
}
MyHandler 应用于您的课程。CreateHandler 方法被调用,此时它创建了一个 MyCallHandler 实例:-
public class MyClass
{
[MyHandler(2)] // Order of 2
public virtual void Foo()
{
Console.WriteLine("Inside method!");
}
}
请注意,我故意将这两个类分开,但实际上您可以只让一个类实现 ICallHandler 接口和 HandlerAttribute 抽象方法(只返回“this”)。
如果没有 HandlerAttribute,您可能可以使用您自己的自定义属性来实现类似的目标,但它可以节省您的时间,因为您无需费心创建自己的策略。
需要注意的一件事 - 如果您采用参数化方法,则不能将调用处理程序作为单例,因为每次都会根据您希望它的顺序创建不同的实例。