【问题标题】:Unity intercept change call handler based on method annotationunity 基于方法注解拦截变更调用处理程序
【发布时间】:2012-09-24 21:12:34
【问题描述】:

我在一个类中有一个方法,我想拦截如下:

[CustomTag1(Order = 0)]
[CustomTag2(Order = 1)]
public virtual DoSomething()

在使用CustomAttributeMatchingRule 时,如何将订单值注入ICallHandler.Order 属性?

我不希望将订单硬编码到处理程序本身或在注册时。我希望它是方法注释的 Order 属性的变量。

【问题讨论】:

    标签: c# unity-container aop interceptor


    【解决方案1】:

    我已经使用 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 的情况下,您可能可以使用您自己的自定义属性来实现类似的效果,但它可以节省您的时间,因为您无需费力地创建自己的策略。

    需要注意的一点 - 如果您采用参数化方法,则不能将调用处理程序设置为单例,因为每次都会根据您希望它的顺序创建不同的实例。

    【讨论】:

    • 这太棒了!感谢您的详细回答,这对您有很大帮助。
    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2014-10-11
    相关资源
    最近更新 更多