ABP VNext学习日记26

2023-11-29 20:38
文章标签 学习 26 日记 abp vnext

本文主要是介绍ABP VNext学习日记26,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.客户端代理生成
解析:首先将Volo.Abp.Http.Client的nuget包添加到客户端项目中:Install-Package Volo.Abp.Http.Client。然后给模块添加AbpHttpClientModule依赖:

[DependsOn(typeof(AbpHttpClientModule))] //添加依赖
public class MyClientAppModule : AbpModule
{ ... }

已经可以创建客户端代理了:

[DependsOn(typeof(AbpHttpClientModule), //用来创建客户端代理typeof(BookStoreApplicationContractsModule) //包含应用服务接口)]
public class MyClientAppModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){//创建动态客户端代理context.Services.AddHttpClientProxies(typeof(BookStoreApplicationContractsModule).Assembly);}
}

AddHttpClientproxies方法获得一个程序集,找到这个程序集中所有的服务接口,创建并注册代理类。

2.AbpRemoteServiceOptions配置
解析:默认情况下AbpRemoteServiceOptions从appsettings.json获取。或者可以使用Configure方法来设置或重写它:

public override void ConfigureServices(ServiceConfigurationContext context)
{context.Services.Configure<AbpRemoteServiceOptions>(options =>{options.RemoteServices.Default =new RemoteServiceConfiguration("http://localhost:53929/");});//...
}

3.AddHttpClientProxies()
解析:AddHttpClientProxies方法有一个可选的参数来定义远程服务的名字:

context.Services.AddHttpClientProxies(typeof(BookStoreApplicationContractsModule).Assembly,remoteServiceConfigurationName: "BookStore"
);

remoteServiceConfigurationName参数会匹配通过AbpRemoteServiceOptions配置的服务端点,如果BookStore端点没有定义就会使用默认的Default端点。

4.作为默认服务
解析:当为IBookAppService创建了一个服务代理,可以直接注入IBookAppService来使用代理客户端。可以传递asDefaultService:false到AddHttpClientProxies方法来禁用此功能:

context.Services.AddHttpClientProxies(typeof(BookStoreApplicationContractsModule).Assembly,asDefaultServices: false
);

[1]如果程序中已经有一个服务的实现并且不想用客户端代理重写或替换其它的实现,就需要使用asDefaultServices:false。
[2]如果禁用了asDefaultService,那么只能使用IHttpClientProxy接口去使用客户端代理。

5.IHttpClientProxy接口
解析:可以像上面那样注入IBookAppService来使用客户端代理,也可以注入IHttpClientProxy<IBookAppService>获取更多明确的用法,这种情况下可以使用IHttpClientProxy<T>接口的Service属性。

6.扩展AbpUsers数据表
解析:
[1]增加一个属性,比如public string MyProperty { get; set; }
[2]更新HelloAbpDbContext.OnModelCreating来配置新属性的映射
[3]更新HelloAbpEfCoreEntityExtensionMappings来扩展IdentityUser实体,增加新属性到迁移文件
[4]运行.DbMigrator工程或者使用Update-Database命令来改变数据库的模式

7.IIdentityUserLookupAppService接口
解析:

public interface IIdentityUserLookupAppService : IApplicationService
{Task<UserData> FindByIdAsync(Guid id);Task<UserData> FindByUserNameAsync(string userName);Task<ListResultDto<UserData>> SearchAsync(UserLookupSearchInputDto input);Task<long> GetCountAsync(UserLookupCountInputDto input);
}

8.PagedResultDto分页功能
解析:

if (input.Sorting.IsNullOrWhiteSpace())
{input.Sorting = nameof(Author.Name);
}
var authors = await _authorRepository.GetListAsync(input.SkipCount,input.MaxResultCount,input.Sorting,input.Filter
);
var totalCount = input.Filter == null? await _authorRepository.CountAsync(): await _authorRepository.CountAsync(author => author.Name.Contains(input.Filter));
return new PagedResultDto<AuthorDto>(totalCount,ObjectMapper.Map<List<Author>, List<AuthorDto>>(authors)
);

9.OnApplicationShutdown方法
解析:如果要在应用程序关闭时执行某些代码,那么可以覆盖该方法。

10.线程运行模式分类
解析:
[1]前台线程:主程序必须等待线程执行完毕后才可退出程序。C#中的Thread默认为前台线程,也可以设置为后台线程。
[2]后台线程:主程序执行完毕立即跟随退出,不管线程是否执行完毕。C#的ThreadPool管理的线程默认为后台线程。
[3]守护线程:守护线程拥有自动结束自己生命周期的特点,它通常被用来执行一些后台任务。

11.Thread中的Join()方法
解析:Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。

12.Socket类
解析:
[1]IPv6MulticastOption:包含用于加入IPv6多路广播组的选项值。
[2]LingerOption:指定在调用Socket或Close()方法之后,如果仍有数据要发送,Close()是否保持连接以及保持多长时间。
[3]MulticastOption:包含用于联接和丢弃多路广播组的IPAddress值。
[4]NetworkStream:为网络访问提供数据的基础流。
[5]SafeSocketHandle:表示套接字句柄的包装类。
[6]SendPacketsElement:表示SendPacketsElement数组中的一个元素。
[7]Socket:实现Berkeley套接字接口。
[8]SocketAsyncEventArgs:表示异步套接字操作。
[9]SocketException:发生套接字错误时引发的异常。
[10]SocketTaskExtensions:此类包含Socket类的扩展方法。
[11]TcpClient:为TCP网络服务提供客户端连接。
[12]TcpListener:侦听来自TCP网络客户端的连接。
[13]UdpClient:提供用户数据报协议(UDP)网络服务。
[14]UnixDomainSocketEndPoint:以路径形式表示Unix域套接字终结点。

13.Socket结构
解析:
[1]IPPacketInformation:通过调用ReceiveMessageFrom(Byte[],Int32,Int32,SocketFlags,EndPoint,IPPacketInformation)或EndReceiveMessageFrom(IAsyncResult,SocketFlags,EndPoint,IPPacketInformation)显示数据包信息。
[2]SocketInformation:对复制Socket时所需的信息进行封装。
[3]SocketReceiveFromResult:ReceiveFromAsync(Socket,ArraySegment<Byte>,SocketFlags,EndPoint)操作的结果。
[4]SocketReceiveMessageFromResult:ReceiveMessageFromAsync(Socket,ArraySegment<Byte>,SocketFlags,EndPoint)操作的结果。
[5]UdpReceiveResult:呈现UDP从对ReceiveAsync()方法的调用接收结果信息。

14.Socket枚举
解析:
[1]AddressFamily:指定Socket类的实例可以使用的寻址方案。
[2]IOControlCode:指定IOControl(Int32,Byte[],Byte[])方法支持的IO控制代码。
[3]IPProtectionLevel:一个可用于将IPv6套接字限制为一个指定范围的值,例如限制为具有相同的链接本地或站点本地前缀的地址。
[4]ProtocolFamily:指定Socket类的实例可以使用的协议类型。
[5]ProtocolType:指定Socket类支持的协议。
[6]SelectMode:为Poll(Int32,SelectMode)方法定义轮询模式。
[7]SocketAsyncOperation:最近使用此上下文对象执行的异步套接字操作的类型。
[8]SocketError:定义Socket类的错误代码。
[9]SocketFlags:指定套接字发送和接收行为。
[10]SocketInformationOptions:描述Socket的状态。
[11]SocketOptionLevel:为SetSocketOption(SocketOptionLevel,SocketOptionName,Int32)和GetSocketOption(SocketOptionLevel,SocketOptionName)方法定义套接字选项级别。
[12]SocketOptionName:定义配置选项名称。
[13]SocketShutdown:定义Shutdown(SocketShutdown)方法使用的常量。
[14]SocketType:指定Socket类的实例表示的套接字类型。
[15]TransmitFileOptions:TransmitFileOptions枚举定义文件传输请求中使用的值。

15.Socket注解
解析:TcpClient、TcpListener和UdpClient类封装了有关创建TCP和UDP连接到Internet的详细信息。

16.WeChatManagement.MiniPrograms
解析:
[1]微信登录[POST]
/api/wechat-management/mini-programs/login/login
[2]对AccessToken续期[POST]
/api/wechat-management/mini-programs/login/refresh
[3]对存储的微信用户信息更新[PUT]
/api/wechat-management/mini-programs/user-info
[4]微信管理相关接口

POST:/api/wechat-management/mini-programs/login/login
POST:/api/wechat-management/mini-programs/login/refresh
GET:/api/wechat-management/mini-programs/login/pc-login-acode
GET:/api/wechat-management/mini-programs/login/pc-login-acode/{miniProgramName}
POST:/api/wechat-management/mini-programs/login/authorize-pc
POST:/api/wechat-management/mini-programs/login/pc-login
POST:/api/wechat-management/mini-programs/login/pc-login-request-tokens
POST:/api/wechat-management/mini-programs/login/bind
POST:/api/wechat-management/mini-programs/login/unbind

17.软件测试类库
解析:
[1]xunit:作为主测试框架
[2]Shoudly:作为断言库
[3]NSubstitute:作为模拟库

18.权限定义原理
解析:
[1]PermissionDefinition执行定义
[2]PermissionDefinitionProvider提供权限
[3]PermissionDefinitionManager核心执行

19.权限授权原理
解析:
[1]PermissionManager:客户端调用
[2]PermissionManagerProvider:把权限授权添加到什么地方,目的是扩展。
[3]IpermissionGrantRepository:具体的权限数据存储实现

20.权限校验[鉴权]原理
解析:
[1]AuthorizationInterceptor
[2]MethodInvocationAuthorizationService
[3]AbpAuthorizationService
[4]PermissionRequirementHandler
[5]PermissionChecker
[6]PermissionValueProviderManager
[7]UserPermissionValueProvider

21.电商项目中权限自定义
解析:可以完全基于任何字段做权限,基于任何字段的值做权限;自定义可以满足所有权限要求:
[1]权限授权自定义:UserEmailPermissionManagementProvider
[2]权限校验自定义:UserEmailPermissionValueProvider

22.AbpLanguagesController
解析:语言切换接口。

23.LocalizationResourceContributorList
解析:根据国家获取具体值。

24.把详细信息输出到客户端
解析:

Configure<AbpExceptionHandlingOptions>(options =>
{options.SendExceptionsDetailsToClients = true;
});

25.自定义异常状态码
解析:

Configure<AbpExceptionHttpStatusCodeOptions>(options =>{options.Map("Volo.Qa:010002", HttpStatusCode.Conflict);
});

参考文献:
[1]ABP黄明基的博客:https://www.cnblogs.com/huangmingji/category/1672930.html
[2]huangmingji/abp-samples:https://github.com/huangmingji/abp-samples
[3]ABP刘永洪的博客:https://blog.csdn.net/liuyonghong159632/category_10350941.html
[4]RebusRabbitMq.AbpExtension:https://github.com/i542873057/RebusRabbitMq.AbpExtension
[5]模块实体扩展:https://docs.abp.io/zh-Hans/abp/4.4/Module-Entity-Extensions
[6]网络编程示例:https://docs.microsoft.com/zh-cn/dotnet/framework/network-programming/network-programming-samples

这篇关于ABP VNext学习日记26的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/434243

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件