为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现。对于下面演示的实例,它们仅仅是具有指导性质的应用,所以我会尽可能地简化,如果大家需要将相应的应用场景移植到具体的项目开发中,需要做更多的优化。
目录
一、对输入参数的格式化
二、对参数的自动化验证
三、对方法的返回值进行自动缓存
我们有一些方法对输入参数在格式上由一些要求,但是我们有不希望对原始传入的参数做过多的限制,那么我们可以通过AOP的方式对输入参数进行格式化。以如下这段代码为例,Demo的Invoke方法有一个字符串类型的参数input,我们希望该值总是以大写的形式存储下来,但是有希望原始的输入不区分大小写,于是我们按照如下的方式在参数上标注一个UpperCaseAttribute。这种类型的格式转换是通过我们自定义的一个名为ArgumentConversionInterceptor的Interceptor实现的,标准在方法上的ConvertArgumentsAttribute就是它对应的InterceptorAttribute。在Main方法中,我们按照DI的形式创建Demo对象(实际上是Demo代理对象),并调用其Invoke方法,那么以小写格式传入的参数将自动转换成大写形式。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var demo = new ServiceCollection() 6 .AddSingleton<Demo, Demo>() 7 .BuildInterceptableServiceProvider() 8 .GetRequiredService<Demo>(); 9 Debug.Assert(demo.Invoke("foobar") == "FOOBAR"); 10 } 11 } 12 public class Demo 13 { 14 [ConvertArguments] 15 public virtual string Invoke([UpperCase]string input) 16 { 17 return input; 18 } 19 }