小白开学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. oracle备份和升级数据库

    同oracle用户登录数据库驻留server.例如,主文件夹/home./oracle.运行以下命令来执行备份操作. sqlplus /nolog connect /as sysdba sql> ...

  2. HQL链接查询

    和SQL查询一样,HQL也支持各种各样的连接查询,如内连接.外连接.我们知道在SQL中可通过join字句实现多表之间的连接查询.HQL同样提供了连接查询机制,还允许显示指定迫切内连接和迫切左外连接.H ...

  3. PHP获取月末时间

    用php获取月末 $a_date = "2009-11-23"; echo date("Y-m-t", strtotime($a_date)); //第二种 ( ...

  4. WPF Path和图形

    <Window x:Class="GeometryDemo.MainWindow" xmlns="http://schemas.microsoft.com/winf ...

  5. 基于IOCP的高速文件传输代码

    //服务端: const   //transmit用的参数   TF_USE_KERNEL_APC     = $20;   //命令类型   CMD_CapScreen             =  ...

  6. SQLServer2008-2012开启远程连接的配置方法

    一.远程连接端口设置(很关键的一步)1.在服务器上打开SQL Server Configuration Manager.选择SQL Server配置管理器->SQL Server 网络配置-&g ...

  7. wpf-MVVM界面自适应:界面自适应及字体自适应

    原文:wpf-MVVM界面自适应:界面自适应及字体自适应 1,界面自适应 界面先划分Region,每个填充Region的View不设置Width属性,即可按照Region划分的比例,自适应屏幕分辨率 ...

  8. 图像Stride求取

    原文:图像Stride求取 做这个日志也许你会觉得多余,但是,如果只给你了图像的流文件,和图像的Width,让你还原原始图像,那么你会发现一个问题,就是Stride未知的问题,这时就需要根据图像的Wi ...

  9. fileapi.h里的API函数(包括LockFileEx和FindFirstChangeNotification函数)

    /** * This file is part of the mingw-w64 runtime package. * No warranty is given; refer to the file ...

  10. UWP入门(二) -- 基础笔记

    原文:UWP入门(二) -- 基础笔记 不错的UWP入门视频,1092417123,欢迎交流 UWP-04 - What i XMAL? XAML - XML Syntax(语法) ,create i ...