小白开学Asp.Net Core《四》

                              —— 使用AspectCore-Framework

一、AspectCore-Framework

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

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

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

二、使用

  • Nuget 安装 Aspectcore 及相关组件

  具体结合Redis来说明:

  Redis采用的是CSRedis

  • Nuget CsRedis 及相关组件的安装

 

下面就直接贴代码了

  • 分布式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; } = * ; 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[]);
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 == )
throw new ArgumentNullException(nameof(redisConnectionStrings));
CSRedisClient redisClient;
if (redisConnectionStrings.Length == )
//单机模式
redisClient = new CSRedisClient(redisConnectionStrings[]);
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中使用

    •  在服务中使用

三、补充说明

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

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

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

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

5、代码源码全部在Github上

四、参考文章

https://github.com/VictorTzeng/Zxw.Framework.NetCore

(本人坚信:学习是由浅到深的过程,先打基础)

    不喜勿喷!谢谢!

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

小白开学Asp.Net Core 《四》的更多相关文章

  1. 小白开学Asp.Net Core 《九》

    小白开学Asp.Net Core <九> — — 前端篇(不务正业) 在<小白开学Asp.Net Core 三>中使用了X-admin 2.x 和 Layui将管理后端的界面重 ...

  2. 小白开学Asp.Net Core 《五》

    小白开学Asp.Net Core<五>                               —— 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...

  3. 小白开学Asp.Net Core 《六》

    小白开学Asp.Net Core <六> —— 探究.Net Core 跨平台的奥秘 1.写这篇文章的初衷 有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://gi ...

  4. 小白开学Asp.Net Core 《七》

    小白开学Asp.Net Core <七> — — 探究中间件(MiddleWare) 1.何为中间件? 中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个 ...

  5. 小白开学Asp.Net Core《三》

    小白开学Asp.Net Core<三> ——界面 我胡汉三再次又回来了(距离上篇时间有点长),今天抽时间将最近对框架采用的后台界面做个记录 1.先上图 (图一) (图二) 2.界面说明 后 ...

  6. 小白开学Asp.Net Core《二》(补)

    小白开学Asp.Net Core<二>(补) ——数据仓储层(Repositroy).服务层(Service) -------------------------------------- ...

  7. 小白开学Asp.Net Core《二》

    小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...

  8. 小白开学Asp.Net Core 《十》

    小白开学Asp.Net Core <十> — — Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...

  9. 小白开学Asp.Net Core 《八》

    小白开学Asp.Net Core <八> — — .Net Core 数据保护组件 1.背景 我在搞(https://github.com/AjuPrince/Aju.Carefree)这 ...

随机推荐

  1. PAMIE- Python实现IE自动化的模块

    PAMIE- Python实现IE自动化的模块(附 网易注册代码) 收藏 安装: 今晚弄了一下.已经成功导入PAMIE.具体步骤如下 1.假如你要用PAM30那就就得去下个Python 3.0安装.因 ...

  2. OpenGL(十八) 顶点数组和抗锯齿(反走样)设置

    顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用.使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERT ...

  3. 3DMax模型输入到WPF中运行

    原文:3DMax模型输入到WPF中运行 其实看看笔者文章之前,可以在网上搜索下将3Dmax模型输入到WPF的办法,大部分结果都是这篇文章.这篇文章呢?有点麻烦,就是我们3Dmax模型转换到Blend的 ...

  4. springboot 配置拦截器

    1 有这样一个需求 服务端对部分请求URL需要验证身份.如果验证错误,停止请求,按照既定的数据格式返回:如果验证正确,继续执行请求. 2 需要这样做 1. 将指定格式的请求拦截下来: 2. 获取参数, ...

  5. docker include not found: networks

    启动clickhouse的docker镜像时,出现了以下错误 include not found: networks google之后发现是因为可能不支持ipv6导致的解决方法 就是通过设置 /etc ...

  6. 一步一步造个IoC轮子(三):构造基本的IoC容器

    一步一步造个Ioc轮子目录 一步一步造个IoC轮子(一):Ioc是什么 一步一步造个IoC轮子(二):详解泛型工厂 一步一步造个IoC轮子(三):构造基本的IoC容器 定义容器 首先,我们来画个大饼, ...

  7. Android permission 动态申请、授权

    原文:Android permission 动态申请.授权 Android permission 新特性深度学习 本篇文章介绍android permission系统,并介绍android 6.0 p ...

  8. WPF 遍历 控件

    比较简单的方式是 在设计一个画面时 先添加一个grid 或其他的布局控件 确保要遍历的控件都在这个Grid中时就可以这么写 foreach (UIElement uie in Grid.Childre ...

  9. 详解 Java 8 HashMap 实现原理

    HashMap 是 Java 开发过程中常用的工具类之一,也是面试过程中常问的内容,此篇文件通过作者自己的理解和网上众多资料对其进行一个解析.作者本地的 JDK 版本为 64 位的 1.8.0_171 ...

  10. Win8MetroC#数字图像处理--2.1图像灰度化

    原文:Win8MetroC#数字图像处理--2.1图像灰度化   [函数说明] 图像灰度化函数GrayProcess(WriteableBitmap src) [算法说明]   图像灰度化就是去掉彩色 ...