小白开学Asp.Net Core《四》 —— 使用AspectCore-Framework

小白开学Asp.Net Core《四》

                              —— 使用AspectCore-Framework

 

一、AspectCore-Framework

 说AspectCore-Framework不得不先谈谈的AOP,

  AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(来自于百度百科)

  AspectCore-Framework 的具体介绍就不在这里造轮子了,下面列出几遍大佬们写的文章。

  • 国内开源社区巨作AspectCore-Framework入门(码农阿宇)

  • AOP组件ASPectCore简单使用(YanBigFeg)

  • AspectCore中的IoC容器和依赖注入

二、使用

  • Nuget 安装 Aspectcore 及相关组件

       640?wx_fmt=png

   具体结合Redis来说明:

  Redis采用的是CSRedis

  • Nuget CsRedis 及相关组件的安装

 640?wx_fmt=png

 下面就直接贴代码了

  •   分布式Redis缓存

public class DistributedCacheManager	{	private static IDistributedCache Instance => AspectCoreContainer.Resolve<IDistributedCache>();	public static string Get(string key)	{	if (RedisHelper.Exists(key))	{	return RedisHelper.Get(key);	}	return null;	}	public static async Task<string> GetAsync(string key)	{	if (await RedisHelper.ExistsAsync(key))	{	var content = await RedisHelper.GetAsync(key);	return content;	}	return null;	}	public static T Get<T>(string key)	{	var value = Get(key);	if (!string.IsNullOrEmpty(value))	return JsonConvertor.Deserialize<T>(value);	return default(T);	}	public static async Task<T> GetAsync<T>(string key)	{	var value = await GetAsync(key);	if (!string.IsNullOrEmpty(value))	{	return JsonConvertor.Deserialize<T>(value);	}	return default(T);	}	public static void Set(string key, object data, int expiredSeconds)	{	RedisHelper.Set(key, JsonConvertor.Serialize(data), expiredSeconds);	}	public static async Task<bool> SetAsync(string key, object data, int expiredSeconds)	{	return await RedisHelper.SetAsync(key, JsonConvertor.Serialize(data), expiredSeconds);	}	public static void Remove(string key) => Instance.Remove(key);	public static async Task RemoveAsync(string key) => await Instance.RemoveAsync(key);	public static void Refresh(string key) => Instance.Refresh(key);	public static async Task RefreshAsync(string key) => await Instance.RefreshAsync(key);	public static void Clear()	{	throw new NotImplementedException();	}	}
  • Aspectcore Framwork 动态代理Redis

[AttributeUsage(AttributeTargets.Method)]	public class RedisCacheAttribute : AbstractInterceptorAttribute	{       	public int Expiration { get; set; } = 10 * 60;	public string CacheKey { get; set; } = null;	public override async Task Invoke(AspectContext context, AspectDelegate next)	{	var parameters = context.ServiceMethod.GetParameters();	if (parameters.Any(it => it.IsIn || it.IsOut))	await next(context);	else	{	var key = string.IsNullOrEmpty(CacheKey)	? new CacheKey(context.ServiceMethod, parameters, context.Parameters).GetRedisCacheKey()	: CacheKey;	var value = await DistributedCacheManager.GetAsync(key);	if (value != null)	{	if (context.ServiceMethod.IsReturnTask())	{	dynamic result = JsonConvert.DeserializeObject(value,	context.ServiceMethod.ReturnType.GenericTypeArguments[0]);	context.ReturnValue = Task.FromResult(result);	}	else	context.ReturnValue = JsonConvert.DeserializeObject(value, context.ServiceMethod.ReturnType);	}	else	{	await context.Invoke(next);	dynamic returnValue = context.ReturnValue;	if (context.ServiceMethod.IsReturnTask())	returnValue = returnValue.Result;	await DistributedCacheManager.SetAsync(key, returnValue, Expiration);	}	}	}	}
  • CSRedis 服务注册

public static IServiceCollection UseCsRedisClient(this IServiceCollection services, params string[] redisConnectionStrings)	{	if (services == null) throw new ArgumentNullException(nameof(services));	if (redisConnectionStrings == null || redisConnectionStrings.Length == 0)	throw new ArgumentNullException(nameof(redisConnectionStrings));	CSRedisClient redisClient;	if (redisConnectionStrings.Length == 1)	//单机模式	redisClient = new CSRedisClient(redisConnectionStrings[0]);	else	//集群模式	redisClient = new CSRedisClient(NodeRule: null, connectionStrings: redisConnectionStrings);	//初始化 RedisHelper	RedisHelper.Initialization(redisClient);	//注册mvc分布式缓存	services.AddSingleton<IDistributedCache>(new Microsoft.Extensions.Caching.Redis.CSRedisCache(RedisHelper.Instance));	return services;	}
  • .Net Core Startup.cs 中注册服务

var redisConnectionString = Configuration.GetConnectionString("Redis");	//启用Redis	services.UseCsRedisClient(redisConnectionString);	return AspectCoreContainer.BuildServiceProvider(services);//接入AspectCore.Injector
  • 具体使用

    • 简单的直接在Controller中使用 

            640?wx_fmt=png

    •  在服务中使用

         640?wx_fmt=png

 


三、补充说明

  1、Redis 客户端安装本文默认都已安装

       2、一定要在Startup.cs 的 ConfigureServices 方法中进行服务的注册,并使用 return AspectCoreContainer.BuildServiceProvider(services); 让AspectCore 接管,不是Aspectcore 是拦截不了的

       3、按照Aspectcore 的官方文档来说,需要加特性的方法必须是虚方法,也就是必须加virtual 修饰。不然不会被调用

       4、本文只是用Redis缓存来说名使用AOP(Aspectcore Framwork)的一方面,并不是说只能用于 Redis ,其他的(如 日志记录等)都可以使用的

       5、代码源码全部在Github上

Github地址:https://github.com/AjuPrince/Aju.Carefree



640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315061.shtml

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

相关文章

P4103 [HEOI2014]大工程 虚树 + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 简化一下题意就是求树上给定点集中每两个点之间的距离之和&#xff0c;相距最远的点&#xff0c;相距最近的点。 对于距离和我们统计一下边的贡献就好啦&#xff0c;边两头的sizesizesize乘…

【翻译】Keras.NET简介 - 高级神经网络API in C#

用C#&#xff0c;远离996Keras.NETKeras.NET是一个高级神经网络API&#xff0c;它使用C#编写&#xff0c;并带有Python绑定&#xff0c;可以在Tensorflow、CNTK或Theano上运行。其关注点是实现快速实验。因为做好研究的关键是&#xff1a;能在尽可能短的时间内从一个想法发展出…

TIOBE 6月排行:C# 以微弱的优势超过了 Visual Basic .NET 的排名,再次进入 TOP 5

月经贴警告……TIOBE 编程语言排行榜 7 月更新已公布&#xff0c;排名前十的分别是&#xff1a;Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, SQL 和汇编语言。和上个月的不同之处主要是 C# 以微弱的优势超过了 Visual Basic .NET 的排名&#xff0c;再次进入…

用.NET Core实现一个类似于饿了吗的简易拆红包功能

需求说明以前很讨厌点外卖的我&#xff0c;最近中午经常点外卖&#xff0c;因为确实很方便&#xff0c;提前点好餐&#xff0c;算准时间&#xff0c;就可以在下班的时候吃上饭&#xff0c;然后省下的那些时间就可以在中午的时候多休息一下了。点餐结束后&#xff0c;会有一个好…

kubernetes实战篇之helm示例yaml文件文件详细介绍

前面完整示例里,我们主要讲解helm打包,部署,升级,回退等功能,关于这里面的文件只是简单介绍,这一节我们详细介绍一下这里面的文件,以方便我们参照创建自己的helm chart.Helm Chart 结构Chart 目录结构mychart/ Chart.yaml LICENSE README.md values.yaml requirements.yam…

P4309 [TJOI2013]最长上升子序列 平衡树 + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 注意到一个很关键的条件&#xff0c;每次插入iii&#xff0c;而iii是递增的&#xff0c;也就是说插入iii之后只会从前面的最大值转移过来&#xff0c;所以我们现在只需要维护插入操作即可&…

【AGC035C】Skolem XOR Tree【异或】【构造】

传送门 题意&#xff1a;给定nnn&#xff0c;构造或判断无法构造一个2n2n2n个结点的树&#xff0c;其中结点iii和ininin的权值为iii,且所有iii和ininin路径权值异或和等于iii。 注意到 2i⊕2i112i\oplus2i112i⊕2i11&#xff0c;然后可以脑补出 然而111没处理 发现1⊕2⊕301\…

ASP.NET Core 管道再探

几乎任何服务器端处理环境都有自己的直通组件管道&#xff0c;用于检查、重路由或修改传入请求和传出响应。经典 ASP.NET 围绕 HTTP 模块理念进行排列&#xff0c;而 ASP.NET Core 采用基于中间件组件的更现代的体系结构。最终目的是相同的 - 允许可配置的外部模块以请求&#…

GRPC与.net core

QQ讨论群&#xff1a;953553560正文系列章节GRPC与.net coreGRPC截止时间与元数据GRPC与netcore IdentityGRPC与netcore IdentityServer4概述GRPC的数据交互模式有&#xff1a;1.单项RPC&#xff0c;最简单的数据交换方式&#xff0c;客户端发出单个请求&#xff0c;收到单个响…

程序员修神之路--做好分库分表其实很难之一

点击上方“蓝字”带你去看小星星菜哥&#xff0c;领导让我开发新系统了这么说领导对你还是挺信任的呀~必须的&#xff0c;为了设计好这个新系统&#xff0c;数据库设计我花了好多心思呢做一个系统我觉得不应该从数据库入手&#xff0c;应该从设计业务模型开始&#xff0c;先不说…

Office 365开发者的前端必备课程

这篇文章其实不仅仅是写给Office 365开发者的&#xff0c;但对于广大的Office 365开发者来说确实相当重要的。这里提到的Office 365开发者&#xff0c;包括了Office Add-ins&#xff0c;SharePoint Add-ins&#xff0c;Microsoft Graph&#xff0c;Microsoft Teams的开发者。我…

【CF1338C】Perfect Triples【位运算】【构造】

传送门 题意&#xff1a;有一序列SSS由下列方式生成&#xff1a; 找到字典序最小的正整数(a,b,c)(a,b,c)(a,b,c)&#xff0c;满足a,b,ca,b,ca,b,c不在SSS中且a⊕b⊕c0a\oplus b\oplus c0a⊕b⊕c0,其中⊕\oplus⊕为异或将a,b,ca,b,ca,b,c加入SSS重复第一步 TTT组数据&#xff…

.NET开发框架(五)-IIS上部署ASP.NET Core项目教程

在之前教程中&#xff0c;我们分享了框架的功能与视频演示介绍(文尾底部提供往期教程快捷链接)系列教程&#xff1a;从初学者到架构师的一步步蜕变本篇经验将和大家介绍如何在IIS上部署ASP.NET Core项目&#xff0c;希望对初学.NET CORE的童靴入门有所帮助&#xff01;1、打开V…

P4146 序列终结者 平衡树 + lazy维护

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 平衡树裸题&#xff0c;直接维护俩lazylazylazy就行了。 需要注意的是&#xff0c;只有儿子节点存在的时候才能更新&#xff0c;不然更新到000号节点之后&#xff0c;给000号点加上了奇怪的…

.NET开发框架(四)-服务器IIS实践教程

前三篇教程中&#xff0c;我们分享了框架的功能与视频演示介绍(文尾底部提供往期教程快捷链接)&#xff0c;今天开始我们进入实践教程&#xff0c;从0开始教学&#xff0c;让你从新手到架构师之兑变&#xff0c;目前已经重置了一台服务器&#xff0c;从安装与配置各组件开始学习…

.NET Core IdentityServer4实战 第六章-Consent授权页

在identityServer4中登陆页面只要是成功了&#xff0c;就会注册一个Cookie在服务器资源上&#xff0c;像现在大部分的网站第三方授权&#xff0c;都是经过一个页面&#xff0c;然后选需要的功能&#xff0c;IdentityServer4也给我们提供了&#xff0c;只要你登陆成功,就会跳转到…

GitHub的CI实践(xUnit / OpenCover /Appveyor / Coveralls.net)

最近利用业余时间实现.ner core 版本的 casbin &#xff0c;即 Casbin.NET。之前的CI都使用的是公司搭建的jenkins和gitlab-runner&#xff0c;对开源社区的工具链并不是很熟悉&#xff0c;在casbin的原作者(hsluoyz )的“要求”下&#xff0c;只能被迫在项目的README.md加入下…

P4847 银河英雄传说V2 非旋treap

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 让我们分析一下题目需要实现什么操作&#xff1a; (1)(1)(1)将某个序列放到某个的后面&#xff0c;也就是合并两个序列。 (2)(2)(2)将一个序列从某处断开。 (3)(3)(3)查询某个序列的一段和…

小白开学Asp.Net Core 《五》

小白开学Asp.Net Core《五》—— 使用.Net Core MVC Filter一、简介今天在项目&#xff08;https://github.com/AjuPrince/Aju.Carefree&#xff09;做登陆权限时&#xff0c;用到了Filter&#xff0c;现将Filer的使用做以下记录。二、Filter 简介Filter俗称过滤器&#xff0c;…

P5217 贫穷 平衡树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 本来是不想写数据结构了&#xff0c;因为明天打蓝桥了&#xff0c;想放松一下&#xff0c;但是看到这个题感觉写起来挺简单的&#xff0c;就试了试&#xff0c;结果… 首先看一下他的操作…