本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!