# 基础类库 **Repository Path**: alpha704/infrastructure ## Basic Information - **Project Name**: 基础类库 - **Description**: 项目介绍: 1、平时常用的方法,进行了总结及拓展。 2、会根据自己的所学开源一些有趣的小玩意。 项目介绍: 类库(Application.ChannelMessage.Extension): 介绍:一个看了CAP源码从而有些骚想法的中间件,根据channel实现了单体项目内的消息收发。 类库(Application.Extension.Infrastructure): 介绍:总结了平时所用的一些方法,将一些常用的东西整合并简化了实现方式,使上手更加容易,其中包含Quartz定时任务、HttpClientFactory请求发送、FluentValidation模型验证、基于Event实现的领域事件、常用的md5加密等。 - **Primary Language**: C# - **License**: Artistic-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2021-05-22 - **Last Updated**: 2021-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基础类库 #### 介绍 简单介绍: 1、平时常用的方法,进行了总结及拓展。 2、会根据自己的所学开源一些有趣的小玩意。 项目介绍: 类库(Application.ChannelMessage.Extension): 介绍:一个看了CAP源码从而有些骚想法的中间件,根据channel实现了单体项目内的消息收发。 类库(Application.Extension.Infrastructure): 介绍:总结了平时所用的一些方法,将一些常用的东西整合并简化了实现方式,使上手更加容易,其中包含Quartz定时任务、HttpClientFactory请求发送、FluentValidation模型验证、基于Event实现的领域事件、常用的md5加密等。 #### 软件架构 没有架构。 #### 安装教程 1. Nuget搜索Application.Extension.Infrastructure、Application.ChannelMessage.Extension。 2. 点击安装最新版本即可(一定要选择最新的,因为旧的迭代过很多次,不知道有啥bug!!!)。 #### 使用说明 1. Application.ChannelMessage.Extension使用说明: 在Startup:ConfigureServices中注入服务: services.AddChannelMessage(option => { option.ConnectionString = "localhost";//数据库链接 option.TableNamePrefix="message";//表名前缀,可选 option.FailedRetryCount=50,//失败重试次数 option.FailedRetryInterval=60,//失败消息轮询延迟时间 option.SucceedMessageExpiredAfter=24*3600//成功消息删除时间 }); 1、发送消息: public class XXXController:Controller { private readonly IChannelPublisher _channelPublisher; public XXXController(IChannelPublisher channelPublisher) { _channelPublisher = channelPublisher; } [HttpGet] public void XXXAction() { _channelPublisher.Write("xxxMessageName",new XXXClass { Name="小红", Age=18, Sex="男" }) } } 2、订阅消息: public class XXXController:Controller { //注意XXXAction需保持在xxxMessageName消息 内名称唯一 [ChannelSubscriber("xxxMessageName", "XXXAction")] public void XXXAction(XXXClass param) { Console.WriteLine("已接收消息:{nameof(XXXAction)}"); } [ChannelSubscriber("xxxMessageName", "YYYAction")] public void YYYAction(XXXClass param) { Console.WriteLine("已接收消息:{nameof(YYYAction)}"); } } 2. Application.Extension.Infrastructure使用说明: Quartz定时: 注意: **Quartz定时任务只能在程序入口处被发现,你写到非入口程序的代码无法被找到** 。 在Startup:ConfigureServices中注入服务:services.AddQuartz(); 新建一个定时任务的类,之后继承JobBase,打上定时任务独有的Attribute。如下: //"0 0/1 * * * ? " corn表达式 //nameof(xxx) 定时任务名 //Group 定时任务分组名 [Job(nameof(xxx), "Group", "0 0/1 * * * ? ")] [DisallowConcurrentExecution] public class XXX : JobBase { public XXX(IServiceScopeFactory serviceScopeFactory):Base(serviceScopeFactory) { } public Task Processing() { //在此写执行代码 var service=GetService();//获取服务用这种方式获取,依赖注入Dbcontext是scope类型会出现问题 } } FluentValidation模型验证: 在Startup:ConfigureServices中注入服务: services.AddMvc(setup =>{setup.Filters.Add(typeof(ValidatorFilter));};//添加异常过滤 Validator.Register();//注册模型验证 使用: //YYY你要验证的类名称 public class XXX: AbstractValidator { public XXX() { RuleFor(x => x.Name).NotEmpty().WithMessage("姓名不能为空"); } } 领域事件Event: 在Startup:ConfigureServices中注入服务: DomainEvent.Register();//注册领域事件 使用: 1、声明一个领域事件: //因为我只声明了单个参数的领域事件,所以多参数请用元组传递,具体传递方式我也会在下面演示 public class XXX { /// /// 声明事件方法 /// public static event DomainEventHandler<(string,int,object)> ActionXXX; /// /// 触发事件方法 /// public static void TriggerXXX(string param1,int param2,object param3) { ActionXXX?.Invoke((param1,param2,param3)); } } 2、注册两个事件接收: //演示了两个事件的监听 public class ClassXXX { public void EventXXX() { XXX.ActionXXX+=((string param1,int param2,object param3) param)=> { Console.WriteLine($"已触发事件 EventXXX"); Console.WriteLine($"param1为: {param.param1},param2为:{param.param2},param3为:{JsonConvert.SerializeObject(param.param3)}"); } } public void EventYYY() { XXX.ActionXXX+=(param)=> { var(param1,param2,param3)=param; Console.WriteLine($"已触发事件 EventYYY"); Console.WriteLine($"param1为: {param1},param2为:{param2},param3为:{JsonConvert.SerializeObject(param3)}"); } } } 3、触发事件: //测试触发事件 [HttpGet] public void Get() { XXX.TriggerXXX("str参数",1024,new { Name="小明", Age=16, Sex="女" }); } HttpClient简单封装: 在Startup:ConfigureServices中注入服务: services.AddHttpClient(); 使用: public class XXXController : Controller { private readonly Client _client; public XXXController(Client client) { _client = client; } [HttpGet] public async Task XXXAction() { var result=await _client.GetString("https://www.baidu.com"); return result; } } #### 参与贡献 1. Fork 本仓库 2. 新建 Application_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 其他信息 1. CSDN博客地址:https://blog.csdn.net/weixin_43837119/article/details/115641961