前一例子演示了自定义属性匹配规则和自定义拦截,现在架设我还需要再进行一次拦截,针对操作询问用户是否要取消方法调用,这样把与用户交互相关的代码也可以抽取出来,否则假设
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]执行完毕......
可以看到,拦截方法的执行顺序正确。