C# 基于方法注释的Unity intercept更改调用处理程序

C# 基于方法注释的Unity intercept更改调用处理程序,c#,unity-container,aop,interceptor,C#,Unity Container,Aop,Interceptor,我想截取类中的一个方法,如下所示: [CustomTag1(Order = 0)] [CustomTag2(Order = 1)] public virtual DoSomething() 使用CustomAttributeMatchingRule时,如何将订单值注入ICallHandler.order属性 我不希望订单硬编码到处理程序本身或注册时。我希望它是方法注释的Order属性的一个变量。我使用HandlerAttribute实现了这一点-一般来说,我在Unity中使用它进行属性样式截取

我想截取类中的一个方法,如下所示:

[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()
使用
CustomAttributeMatchingRule
时,如何将订单值注入
ICallHandler.order
属性


我不希望订单硬编码到处理程序本身或注册时。我希望它是方法注释的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,您可能可以使用自己的自定义属性实现类似的功能,但这样可以节省时间,因为您不需要费心创建自己的策略


需要注意的一点是,如果采用参数化方法,则不能将调用处理程序作为单例,因为每次都会创建不同的实例,具体取决于您希望它的顺序。

这太棒了!谢谢你详细的回答,帮了大忙。