面向切面编程(AOP)
程序员文章站
2024-01-01 16:38:10
结合设计模式,通过代码理解面向切面编程,有代码的很好理解的,5分钟可以看三遍 通过,结构型设计模式,装饰器模式来实现AOP,代码如下 通过,结构型设计模式,代理模式来实现AOP,代码如下 通过Unity实现AOP,配置太复杂就不贴了。。。就一个实现类的代码,可以用于添加方法的日志,异常处理,不用修改 ......
结合设计模式,通过代码理解面向切面编程,有代码的很好理解的,5分钟可以看三遍
通过,结构型设计模式,装饰器模式来实现aop,代码如下
/// <summary> /// 装饰器模式实现静态代理 /// aop 在方法前后增加自定义的方法 /// </summary> public class decoratoraop { public static void show() { user user = new user() { name = "eleven", password = "123123123123" }; //直接调用 iuserprocessor processor = new userprocessor(); processor.reguser(user); console.writeline("***************"); //通过装饰器模式,在方法执行前后添加功能 processor = new userprocessordecorator(processor); processor.reguser(user); } public interface iuserprocessor { void reguser(user user); } public class userprocessor : iuserprocessor { public void reguser(user user) { console.writeline("用户已注册。name:{0},password:{1}", user.name, user.password); } } /// <summary> /// 装饰器的模式去提供一个aop功能 /// </summary> public class userprocessordecorator : iuserprocessor { private iuserprocessor _userprocessor { get; set; } public userprocessordecorator(iuserprocessor userprocessor) { this._userprocessor = userprocessor; } public void reguser(user user) { beforeproceed(user); this._userprocessor.reguser(user); afterproceed(user); } /// <summary> /// 业务逻辑之前 /// </summary> /// <param name="user"></param> private void beforeproceed(user user) { console.writeline("方法执行前"); } /// <summary> /// 业务逻辑之后 /// </summary> /// <param name="user"></param> private void afterproceed(user user) { console.writeline("方法执行后"); } } }
通过,结构型设计模式,代理模式来实现aop,代码如下
/// <summary> /// 代理模式实现静态代理 /// aop 在方法前后增加自定义的方法 /// </summary> public class proxyaop { public static void show() { user user = new user() { name = "eleven", password = "123123123123" }; iuserprocessor processor = new userprocessor(); //直接调用方法 processor.reguser(user); console.writeline("***************"); //实现aop,在执行前后加其他方法 processor = new proxyuserprocessor(); processor.reguser(user); } public interface iuserprocessor { void reguser(user user); } public class userprocessor : iuserprocessor { public void reguser(user user) { console.writeline("用户已注册。name:{0},password:{1}", user.name, user.password); } } /// <summary> /// 代理模式去提供一个aop功能 /// </summary> public class proxyuserprocessor : iuserprocessor { private iuserprocessor _userprocessor = new userprocessor(); public void reguser(user user) { beforeproceed(user); this._userprocessor.reguser(user); afterproceed(user); } /// <summary> /// 业务逻辑之前 /// </summary> /// <param name="user"></param> private void beforeproceed(user user) { console.writeline("方法执行前"); } /// <summary> /// 业务逻辑之后 /// </summary> /// <param name="user"></param> private void afterproceed(user user) { console.writeline("方法执行后"); } } }
通过unity实现aop,配置太复杂就不贴了。。。就一个实现类的代码,可以用于添加方法的日志,异常处理,不用修改方法本身,不用挨个方法+log.info()了,通过unity(ioc)创建的对象都能用,代码如下
public class logbeforebehavior : iinterceptionbehavior { public ienumerable<type> getrequiredinterfaces() { return type.emptytypes; } public imethodreturn invoke(imethodinvocation input, getnextinterceptionbehaviordelegate getnext) { console.writeline("logbeforebehavior"); console.writeline(input.methodbase.name); foreach (var item in input.inputs) { console.writeline(newtonsoft.json.jsonconvert.serializeobject(item)); //反射&序列化获取更多信息 } return getnext().invoke(input, getnext);// } public bool willexecute { get { return true; } } }
再加一个unity创建对象和调用的代码吧,nuget添加unity的引用
public class unityconfigaop { public static void show() { user user = new user() { name = "eleven", password = "12345678934534643" }; //这个是代码块,好神奇的呦 { //配置unitycontainer iunitycontainer container = new unitycontainer(); execonfigurationfilemap filemap = new execonfigurationfilemap(); filemap.execonfigfilename = path.combine(appdomain.currentdomain.basedirectory + "cfgfiles\\unity.config"); configuration configuration = configurationmanager.openmappedexeconfiguration(filemap, configurationuserlevel.none); unityconfigurationsection configsection = (unityconfigurationsection)configuration.getsection(unityconfigurationsection.sectionname); configsection.configure(container, "aopcontainer"); iuserprocessor processor = container.resolve<iuserprocessor>(); processor.reguser(user); } } }