前言

本章结束之后,这个abp vnext系列算是初步完结了,基础的组件都已经接入了。如果各位还需要其它的组件的话,可以自己按需要进行接入使用。其实这个只是一个基础的框架,可以自己根据需要进行变通的。比如:如果没有太多需求且更熟悉三层的同学可以把application和application.contract去掉就是一个三层架构了。基础是基础,用好还是要看各位对业务的理解是否够深入才能发挥好框架的作用。

对于各个框架的使用,建议是:先使用起来,然后熟悉它,再然后改造它。并不是按照别人的标准一味的照抄,每一个框架都会有相应的痛点。。因此在使用的时候是要根据项目与团队来进行评估是否适用,若不适用的时候,如何去调整。这个不仅仅是架构师要考虑的事情。

个人经验(仅作参考):建议每一位有想法开发人员都要保持自己的独立思考能力,无论是针对业务还是技术。但是前期是先积累技术自己验证,多在群里友好交流,不说教只分析。先从大量的文章和博客中获取知识,理出自己需要的进行沉淀。到了一定地步(这个一定地步只能看感觉,这种感觉会非常的明显,需要自己保持反思,相当于比较大的坎,越过之后就是新的开始的这种)之后,再配合一些好的收费课程和书籍去深入和系统化的学习。比如:曾经我就在群里看到一个大佬的分享然后开始入门算法,当时他分享的是hash算法,后面我有把它很白话的用场景分享给前端朋友,他也才发现原来还能这么玩。有需要的话,可以在评论区留言,我看下是否需要找个时间整理出来,可能时间会比较长一点。。

简要说明

【项目源码】

【章节目录】

本文主要介绍如何在abp vnext中使用redis和httpclient。

首先Redis是目前应用最广泛的分布式缓存方案,这个就不进行更多的介绍了。而我们利用的组件是Microsoft.Extensions.Caching.StackExchangeRedis。此组件也是依赖于StackExchange.Redis,本文直接使用IDistributedCache来做字符的缓存,目前此接口主要是支持string与byte[]的操作,因此缓存实体也是通过序列化成字符串来进行缓存。若有更进一步的类型缓存需要的同学则可以通过StackExchange.Redis的方法来操作如:zset,list,hash等类型,这里就不作过多介绍了。到时候看情况,如果真的有很多人反馈需要的话,我再写下怎么比较完整的接入StackExchange.Redis吧!

其次是httpclient,由于我们的系统经常会请求到各位外部的接口。因此这个的引入也是非常重要的。我们使用来管理的组件是Refit.HttpClientFactory。通过Refit.HttpClientFactory,我们可以使用接口与注解的方式来请求外部接口。管理起来非常方便,同时此组件也是通过HttpClientFactory来管理的,并不需要我们作过多的优化。

具体步骤

1.1、首先我们需要知道的是,我们的Redis是主要是在Application层才会需要使用的。因此,原来Host里面的引入的Redis相关组件可以删除了。定位到AbpVnext.Learn.HttpApi.Host把Microsoft.Extensions.Caching.StackExchangeRedis,Microsoft.AspNetCore.DataProtection.StackExchangeRedis卸载掉。同时删除掉Host中的Module的相关代码。

1.2、然后我们定位到AbpVnext.Learn.Domain层安装我们需要的nuget包Microsoft.Extensions.Caching.StackExchangeRedis。定位到LearnDomainModule,增加以下代码用于注入IDistributedCache的Redis服务:

public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = configuration["Redis:Configuration"];
});
}

1.3、然后我们在UserAppServices中使用IDistributedCache去操作缓存,如下:

public async Task<UserDto> get_userbyuserid(Guid userid)
{
var cachekey = $"user_{userid.ToString()}";
var userdto_str =await _distributedCache.GetStringAsync(cachekey);
if (String.IsNullOrEmpty(userdto_str))
{
var usermodel = await _repository.get_userinfo(userid);
if (usermodel != null)
{
var userdto = new UserDto() { Id = usermodel.Id, user_status = usermodel.user_status, user_name = usermodel.user_name, user_phone = usermodel.user_phone };
await _distributedCache.SetStringAsync(cachekey, Newtonsoft.Json.JsonConvert.SerializeObject(userdto));
return userdto;
}
}
else
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<UserDto>(userdto_str);
}
return null;
}

1.4、修改UserAppServices中的get_userbyuserid方法如下:

public async Task<UserDto> get_userbyuserid(Guid userid)
{
var cachekey = $"user_{userid.ToString()}";
var userdto_str =await _distributedCache.GetStringAsync(cachekey);
if (String.IsNullOrEmpty(userdto_str))
{
var usermodel = await _repository.get_userinfo(userid);
if (usermodel != null)
{
var userdto = new UserDto() { Id = usermodel.Id, user_status = usermodel.user_status, user_name = usermodel.user_name, user_phone = usermodel.user_phone };
await _distributedCache.SetStringAsync(cachekey, Newtonsoft.Json.JsonConvert.SerializeObject(userdto));
return userdto;
}
}
else
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<UserDto>(userdto_str);
}
return null;
}

然后调试项目,调用init接口,查看Redis如下:

我们可以看到,IDistributedCache的调用String操作到了Redis里面是使用的hash结构来做存储的。

1.5、封装一个RedisHelper来统一操作Redis,这样若是后期修改了组件也不需要修改太多的代码。如下图,

修改UserAppServices中的方法如下:

调试后,效果与原来的redis一致。

2.1、接下来我们来接入Refit.HttpClientFactory,其实我们的httpclient也是在Application层才使用的。因此我们也是在Domain层进行接入。Refit的接入的话,建议是为每一个不同的外部请求的根域名定义一个接口。然后再引入,这是因为Refit注入是需要server的。下面我们拿一个微信的Api接口来做为入门例子。

2.2、首先定义IWechatApi接口加入以下代码:

		//获取微信公众号的access_token
[Get("/cgi-bin/token")]
Task<WechatAccessTokenModel> get_accesstoken(string appid, string secret, string grant_type = "client_credential");

在Dommain.Shared中补充好需要的WechatAccessTokenModel。对应的是微信公众号接口返回的字段。access_token,expires_in,一般我会定义一个BaseWechatModel用于接收errcode,errmsg。如下

 public class BaseWechatModel
{
//错误时微信会返回错误码
public int errcode { get; set; }
//错误信息
public string errmsg { get; set; }
}
//微信获取Access_Token的模型
public class WechatAccessTokenModel: BaseWechatModel
{
public string access_token { get; set; }
public int expires_in { get; set; }
}

2.3、接下来我们回到LearnDomainModule中,注入IWechatApi如下:

context.Services.AddRefitClient<IWechatApi>().ConfigureHttpClient(c => c.BaseAddress = new Uri("https://api.weixin.qq.com"));

然后我们在UserAppServices随便找个方法调用一下,试试效果如下则表示我调用的返回是正常的。由于我使用的appid是错误的导致的。

[Abp vNext 入坑分享] - 8.Redis与Refit的接入的更多相关文章

  1. [Abp vNext 入坑分享] - 前言

    一·背景 Abp vnext是 ABP 框架作者所发起一个完全基于 ASP .NET Core框架,截至2020年4月份已经升级到2.5.0版本,根据经验2.0版本以后可以放心的使用在生产环境.类似a ...

  2. [Abp vNext 入坑分享] - 7.Automapper与validation的使用

    简要说明 [项目源码] [章节目录] 本文主要介绍Automapper与Validation的使用方法.首先使用Automapper的目的是引入组件完成entity与dto之间的转换以达到简化代码的目 ...

  3. [Abp vNext 入坑分享] - 4.JWT授权的接入

    一.感想 在写这一系列文章之前,本来以为写这个之前已经搭建好的框架描述会比较简单,但是慢慢写下来才发现.写这个真的不简单额,本来以为图文一起,一个晚上应该能输出一篇吧...结果:现实真的骨感,一个星期 ...

  4. [Abp vNext 入坑分享] - 1.创建初始的项目

    一.简要说明 本篇文章主要是跟着官方的文档把项目安装好先,同时了解一下大概的项目结构. 二.具体步骤 2.1全局安装ABP CLI,直接在cmd中安装即可.如果你之前安装过,这里可以略过: dotne ...

  5. [Abp vNext 入坑分享] - 2.简化项目结构

    一.简要说明 本篇文章根据我自己的需要对项目结果进行简化,让项目结构更符合我自己的要求,同时让项目跑起来.仅供参考 二.具体步骤 2.1卸载掉对我来说目前使用不上的项目,identityserver, ...

  6. [Abp vNext 入坑分享] - 3.简单的用户模块功能开发

    一.简要说明 本篇文章开始进行业务模块的开发模拟,借助user模块来进行业务开发,主要是用户相关的基础操作.主要是先使用Users来体验整个开发的流程.主要是先把一个基础流程跑顺利,在这里我并不会过于 ...

  7. [Abp vNext 入坑分享] - 6.完整接入swagger

    前言 由于最近一直在修改一下排版,同时找了非技术的朋友帮忙看一下排版的问题,现在已经基本上确定了排版和样式了.更新可以恢复正常了. 作为一个写前端代码基本只写js不写css的开发,搞排版真的头疼..各 ...

  8. [Abp vNext 入坑分享] - 5.全局异常替换

    一.简要说明 [项目源码] [章节目录]   前面我们已经初步完成了框架的功能了,jwt的也已经接入完成了.   现在需要进行全局异常的接入了,abpvnext官方本来就有了全局异常的模块了,介绍链接 ...

  9. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

随机推荐

  1. javascript中Function、ArrowFunction和GeneratorFunction介绍

    ECMAScript规范中对Function的文档描述,我认为是ECMAScript规范中最复杂也是最不好理解的一部分,它涉及到了各方面.光对Function就分了Function Definitio ...

  2. Vim Operations

    Vim有三种模式:输入模式.命令模式和末行命令模式. 输入模式用来输入文字,命令模式用来下达编排文件的操作指令,末行命令模式用来进行文件存档.离开编辑器等操作. 进入及离开 末行模式下: :w 保存当 ...

  3. C++入门编程题目 NO.1

    题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. #incl ...

  4. codeforce 227D Naughty Stone Piles (贪心+递归+递推)

    Description There are n piles of stones of sizes a1, a2, -, an lying on the table in front of you. D ...

  5. django-haystack全文检索详细教程

    前几天要用Django-haystack来实现搜索功能,网上一搜中文资源少之又少,虽说有官方文档,但相信对于我们这些英语差的同学来说要看懂真的是一件难事.特别是关于高级部分,特地找了个英语专业的来翻译 ...

  6. 前端——Vue CLI 3.x搭建Vue项目

    一.Node安装 windows 1. Node.js (>=8.9, 推荐8.11.0+) Node官网下载 .msi 文件,按步骤下载安装即可. 安装完之后在cmd中输入 node -v,若 ...

  7. P2765 魔术球问题 网络流二十四题重温

    P2765 魔术球问题 知识点::最小点覆盖 这个题目要拆点,这个不是因为每一个球只能用一次,而是因为我们要求最小点覆盖,所以要拆点来写. 思路: 首先拆点,然后就是开始建边,因为建边的条件是要求他们 ...

  8. 搬东西 dp

    搬东西 现有n个扁担以及一辆货车,扁担一次挑两个货物,货车可以装K个货物,货车只能运送一次货物. 现在qwb要把总共2n+k个货物搬到某个地方.现在qwb想选K个货物让货车先运走,然后剩下的2n个货物 ...

  9. Oracle的pl/sql变量类型

    pl/sql定义 sql是结构化查询语言.sql是不是一个编程语言?编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言.我们在实际的开发中,有这种需要,把s ...

  10. 设计模式之GOF23代理模式03

    动态代理 public class StarHandler implements InvocationHandler{  Star realStar; public StarHandler(Star ...