Unity面向切面编程

一直说面向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.hqwc.cn/news/636729.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python怎么连接oracle

一&#xff1a;弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1a;系统版本&#xff0c;python版本&#xff0c;oracle客户端的版本&#xff0c;cx_Oracle的版本…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

Pytorch实现线性回归模型

在机器学习和深度学习的世界中&#xff0c;线性回归模型是一种基础且广泛使用的算法&#xff0c;简单易于理解&#xff0c;但功能强大&#xff0c;可以作为更复杂模型的基础。使用PyTorch实现线性回归模型不仅可以帮助初学者理解模型的基本概念&#xff0c;还可以为进一步探索更…

【归并】Leetcode 排序数组

题目讲解 912. 排序数组 算法讲解 使用归并算法排序数组&#xff0c;我们先在数组中寻找一个mid点&#xff0c;然后把数组分成了两部分&#xff0c;我们先排左部分&#xff0c;排左边部分的时候有需要将当前的子数组分成两部分&#xff0c;继续循环&#xff0c;直到当前子数组…

嵌入式物联网开发基石

前言 嵌入式物联网开发工程师&#xff0c;是一个蓝海新风口&#xff0c;高薪不内卷的行业。需要掌握熟悉c/c、单片机、数据结构&#xff0c;linux系统&#xff0c;ARM单片机&#xff0c;嵌入式。可以从事工作项目loT、视频监控领域的产品&#xff0c;跨平台系统&#xff0c;智能…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核&#xff0c;以完成OS该有的功能&#xff0c;例如&#xff0c;文件系统&#xff0c;网络&#xff0c;内存管理&#xff0c;进程调度&#xff0c;驱动等 &#xff0c;向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

时序分析基础(6)——input delay时序分析

1 简介 FPGA对于外部的时钟以及数据的延时信息是不知道的&#xff0c;在低速时钟且时钟发射沿在数据正中心的时候&#xff0c;一般可以不做约束来直接使用。但是到了高速时钟或者双沿采样或者发射沿和数据对齐的情况下&#xff0c;这时候就需要告诉VIVADO外部的时钟与数据情况来…

前端css中border-radius的简单使用

前端css中border-radius的使用 一、前言二、border-radius语法三、border-radius的模型例子1.源码12.源码1效果截图 四、border-radius的动画效果&#xff08;动态交互&#xff09;1.源码22.源码2显示效果 五、结语六、定位日期 一、前言 在CSS中&#xff0c;我们常用border-r…

LE Audio —— Boardcast 与 Unicast 对比

蓝牙低功耗音频&#xff08;Bluetooth LE Audio&#xff0c;简称&#xff1a;LE Audio&#xff09;自 2020 年 1月 发布&#xff0c;到 2022 年 7 月完成全套规范的定义。 LE Audio是新一代蓝牙音频技术标准&#xff0c;采用了全新的音频架构&#xff0c;充分利用低功耗蓝牙无…

二维码门楼牌管理应用平台建设:网格化管理的新篇章

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、二维码门楼牌管理应用平台的实际应用四、二维码门楼牌管理应用平台的前景展望 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台的建设已成为城市网格化管理…

【Java基础】25.包(package)

文章目录 前言一、包的作用二、创建包三、import 关键字四、package 的目录结构五、设置 CLASSPATH 系统变量 前言 为了更好地组织类&#xff0c;Java 提供了包机制&#xff0c;用于区别类名的命名空间。 一、包的作用 把功能相似或相关的类或接口组织在同一个包中&#xff…

STM32 HAL库 利用CH376进行USB文件读写

STM32 其实可以进行读取USB文件,但仅限于F4以上芯片才可以进行SUB文件读写,但在项目开发中,往往用不到此芯片,那么只能通过外挂的USB芯片进行USB文件读写,本文则是采用STM32F103的SPI与CH376进行通信,通过CH376操作指令进行操作。 1、CH376介绍 CH376芯片 是沁恒的一款文…