一直说面向AOP(切面)编程,好久直接专门扒出理论、代码学习过。最近因为某些原因😭还得再学学造火箭的技术。
废话不多说,啥是AOP呢?这里我就不班门弄斧了,网上资料一大堆,解释的肯定比我清楚~
用三层的结构来说。一个请求的处理顺序是:UI=》BLL=>DAL=》BLL=》UI。
那么问题来了,如果某天老板为应付检查,要增加操作日志。普通处理方式是我把A、B、C…的方法全部改造一遍,增加操作日志。系统小还好说,如果是代码山那改动可就大了…
咋整?
这会就用到AOP思想了。(UI=》 ( Log =》) BLL=>DAL=》BLL=》 UI)
UI接收到请求后 在请求BLL的时候统一增加日志记录。
下面用Unity中间件实现的,
- 引入nuget包
- 增加Unity配置
<?xml version="1.0" encoding="utf-8"?>
<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration" /></configSections><unity><sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration" /><containers ><container name="aopContainer"><extension type="Interception"/><register type="learn04.IUserProcessor,learn04" mapTo="learn04.UserProcessor,learn04"><!--InterfaceInterceptor:继承接口的方法都会被拦截。TransparentProxyInterceptor:继承类使用的方法都会被拦截。VirtualMethodInterceptor:继承的方法必须是虚方法且必须是公开的方法才会被拦截。--><interceptor type="InterfaceInterceptor"/><!--配置文件的注册顺序是调用顺序,然后才是业务方法,但是扩展逻辑也可以在业务方法之后--><interceptionBehavior type="learn04.LogBeforeBehiavor, learn04"/></register></container></containers></unity>
</configuration>
- 上代码:
public class User
{public string Name { get; set; }public string Password { get; set; }
}public interface IUserProcessor
{void RegUser(User user);
}public class UserProcessor : IUserProcessor
{public void RegUser(User user){Console.WriteLine($"用户已注册:Name:{user.Name}");}
}public class LogBeforeBehiavor:IInterceptionBehavior
{public IEnumerable<Type> GetRequiredInterfaces(){return Type.EmptyTypes;}public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext){Console.WriteLine("LogBeforeBehavior");foreach (var item in input.Inputs){Console.WriteLine(item.ToString());//反射获取更多信息}var query = getNext().Invoke(input,getNext);return query;}public bool WillExecute{get { return true; }}
}public class UnityConfigAop
{public static void Show(){ User user = new User(){ Name ="马六",Password = "123"};IUnityContainer container = new UnityContainer();ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "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);}
}internal class Program
{static void Main(string[] args){UnityConfigAop.Show();Console.ReadKey();}
}
执行结果:
当然AOP只是一种思想,实现的方式千万条。这里就先用这种写写~
相信只要是.net 的同学都会搞,如果你好久没复习过技术了(毕竟都是流水线搬砖)可以复制下代码来跑跑。注释已经把该说的说了。这里就不多废话了~