小白开学Asp.Net Core 《四》
小白开学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 《四》的更多相关文章
- 小白开学Asp.Net Core 《九》
小白开学Asp.Net Core <九> — — 前端篇(不务正业) 在<小白开学Asp.Net Core 三>中使用了X-admin 2.x 和 Layui将管理后端的界面重 ...
- 小白开学Asp.Net Core 《五》
小白开学Asp.Net Core<五> —— 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...
- 小白开学Asp.Net Core 《六》
小白开学Asp.Net Core <六> —— 探究.Net Core 跨平台的奥秘 1.写这篇文章的初衷 有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://gi ...
- 小白开学Asp.Net Core 《七》
小白开学Asp.Net Core <七> — — 探究中间件(MiddleWare) 1.何为中间件? 中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个 ...
- 小白开学Asp.Net Core《三》
小白开学Asp.Net Core<三> ——界面 我胡汉三再次又回来了(距离上篇时间有点长),今天抽时间将最近对框架采用的后台界面做个记录 1.先上图 (图一) (图二) 2.界面说明 后 ...
- 小白开学Asp.Net Core《二》(补)
小白开学Asp.Net Core<二>(补) ——数据仓储层(Repositroy).服务层(Service) -------------------------------------- ...
- 小白开学Asp.Net Core《二》
小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...
- 小白开学Asp.Net Core 《十》
小白开学Asp.Net Core <十> — — Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...
- 小白开学Asp.Net Core 《八》
小白开学Asp.Net Core <八> — — .Net Core 数据保护组件 1.背景 我在搞(https://github.com/AjuPrince/Aju.Carefree)这 ...
随机推荐
- 超平面(hyperplane)的定义
Hyperplane - Wikipedia Hyperplane – from Wolfram MathWorld a1,a2,-,an 为一组不全为 0 的纯量,如下定义的集合 S 由这样的向量构 ...
- hann function
hann function 是一种离散型窗函数,定义如下: w(n)=12(1−cos(2πnN−1))=sin2(πnN−1) 窗口的长度为 L=N+1; hann function 以及其傅里叶响 ...
- wordpress如何判断手机、平板还是PC并显示对应的内容-Mobile Detect
wordpress如何判断是手机.平板还是PC访问,并针对性的显示特定的内容?Mobile Detect 这个轻量级PHP 类库能够很好的实现这个功能.而且Mobile Detect也有wordpre ...
- C# 操作XML文档 使用XmlDocument类方法
W3C制定了XML DOM标准.很多编程语言中多提供了支持W3C XML DOM标准的API.我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询.在本文中,我来介绍一下.Ne ...
- ASP.NET Core SameSite 设置引起 Cookie 在 QQ 浏览器中不起作用
最近在发布了基于 ASP.NET Core 实现的新版登录页面之后,陆陆续续地接到用户反馈登录时 Antiforgery Token 总是验证失败. 日志中记录的对应错误是 Antiforgery t ...
- 宽字符std::wstring的长度和大小问题?sizeof(std::wstring)是固定的32,说明std::wstring是一个普通的C++类,而且和Delphi不一样,没有负方向,因为那个需要编译器的支持
std::wstring ws=L"kkkk"; int il=ws.length(); int ia=sizeof(ws); int ib=sizeof(&qu ...
- 【msdn wpf forum翻译】获取当前窗口焦点所在的元素
原文:[msdn wpf forum翻译]获取当前窗口焦点所在的元素 原文地址: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b ...
- ASP.NET MVC 学习笔记1 Talk about controller & route
For the sake of learning programming better, I'd like to increase the frequency of using English. So ...
- TP5.0中使用trace调试
1.在项目 的配置文件config.php 配置, 2.在程序中使用trace: 3.在浏览器网页上打开 得到如下图所示:点击 “用户变量”,即可查看使用trace输出的变量 或者我们使用 trace ...
- ASP.NET MVC 下UpdateModel可空未填写的参数为Null,为何不是空字符串
查了好久,终于收到原因: if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && Object.Equals(valu ...