微软企业库5.0-面向切面AOP(PolicyInjection)学习记录 --控制CallHandler的执行顺序

来源:互联网 发布:腾讯互娱php怎么样 编辑:程序博客网 时间:2024/06/05 06:49

     

   前一例子演示了自定义属性匹配规则和自定义拦截,现在架设我还需要再进行一次拦截,针对操作询问用户是否要取消方法调用,这样把与用户交互相关的代码也可以抽取出来,否则假设

    public class Person : IPerson

{

        public void Shout(string aa)

        {

          //这个方法很危险,会修改数据,需要提醒用户确认是否坚持执行

        //那么不可可能会在这里加入一些与用户交互的代码       

            Console.WriteLine(aa);

        }

}

而我希望采用与前一例子同样的方式来处理上面的问题,那么我就再实现一个CallBackHandler,如下

[ConfigurationElementType(typeof(CustomCallHandlerData))]

    public class DangerCallHandler : ICallHandler

    {

        public string Message { get; private set; }       

        public DangerCallHandler(System.Collections.Specialized.NameValueCollection attributes)

        {

            this.Message = String.IsNullOrEmpty(attributes["Message"]) ?"" : attributes["Message"];

        }

        public DangerCallHandler(string Message)

        {

            this.Message = Message;

        }

        public IMethodReturn Invoke(IMethodInvocation input,GetNextHandlerDelegate getNext)

        {

            if (input == null) throw newArgumentNullException("input");

            if (getNext == null) throw newArgumentNullException("getNext");

            Console.WriteLine(Message);

            char key = Convert.ToChar(Console.Read());

            if (key == 'Y' || key == 'y')

            {

                var result = getNext()(input, getNext);

                return result;

            }

            throw new Exception("输入无效!");

        }

        public int Order { get; set; }

}

在配置文件里做如下修改

可以看到,现在有两个Handler,而这时候[Order]就可以起到作用了,用来控制handler的执行顺序,编译,然后运行,输出如下:

用户[]试图执行[Shout]......

确认输入Y,否则输入其它:

y

Hello world ! Come ......

[Shout]执行完毕......

 

可以看到,拦截方法的执行顺序正确。

 

 

 

 

 

 

原创粉丝点击