Unity面向切面编程

news/2024/9/24 7:46:26/

一直说面向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 的同学都会搞,如果你好久没复习过技术了(毕竟都是流水线搬砖)可以复制下代码来跑跑。注释已经把该说的说了。这里就不多废话了~


有兴趣的同学可以关注我,一起学习哈~


http://www.ppmy.cn/news/1428261.html

相关文章

排序之插入排序:从斗地主到插入排序

目录 1.斗地主如何摸牌 2.从摸牌想到插入排序 3.完成插入排序 4.结束语 1.斗地主如何摸牌 不知道各位是否玩过几乎人人都玩过的斗地主游戏呢&#xff1f;相必各位或多或少都玩过一点&#xff0c;再没玩过也看别人打过。今天博主就将从这个游戏为大家讲解我们的插入排序。 在…

使用 code-server 搭建在线的 VS Code 编辑器

文章目录 前言安装体验后记 前言 VS Code 是一个非常流行的代码编辑器&#xff0c;安装各种拓展下也可以当作全功能的IDE使用。VS Code本身是基于Web方案构建的&#xff0c;完全可以搭建服务器&#xff0c;然后通过浏览器访问。事实上官方就是这么设计的。现在打开任何一个Git…

应用编程之线程(二-同步篇)

线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xff0c;那就是多个线程并发访问共享数据所导致的数据不一 致的问题。 一、为什么需要线程同步 线程同步是为了对共享资源的访问进行保护…

详解QListView、QListWidget、QTableView、QTableWidget的使用以及区别

在Qt框架中&#xff0c;QListView、QListWidget、QTableView和QTableWidget都是用于显示列表或表格数据的控件。它们在用途、数据模型、灵活性以及直接操作数据的便捷性等方面存在一定的差异。下面将详细阐述这些控件的使用方法以及它们之间的区别&#xff0c;并提供相应的C代码…

pdf在线免费转word网站推荐,纯免费、不注册

pdf在线免费转word网站推荐&#xff0c;纯免费、不注册 pdf在线免费转word文档 https://orcc.online/pdf 不限次数、免费不需要注册&#xff0c;上传之后过一段时间&#xff0c;右侧就会出现转换完成的word文档。 其他工具 时间戳转换 https://orcc.online/timestamp Base…

VL3 奇偶校验

奇偶校验 定义&#xff1a; 这里的奇偶是数据中&#xff0c;1的个数 比如奇校验为1 &#xff0c;就是说数据中1的个数是奇数个。 同理 偶校验为0.就是说数据中1的个数不是偶数个。 那么就说&#xff1a;奇校验为1 与 偶校验为0 互为否的关系&#xff08;not&#xff09;这里再…

聚观早报 | 理想L6正式发布;Meta发布Llama 3

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月20日消息 理想L6正式发布 Meta发布Llama 3 比亚迪秦L内饰曝光 小米14 Ultra推送新版澎湃OS OPPO A3 Pro正式…

访问学者申请的成功经验

在申请成为访问学者时&#xff0c;经验是至关重要的。下面知识人网小编将介绍一些可以帮助您成功申请的经验和技巧。 首先&#xff0c;了解目标机构或大学的研究方向和需求是非常重要的。在申请之前&#xff0c;仔细研究该机构的学术项目、研究成果以及教授的专业领域&#xff…