- autoMapper:字段映射
- FluentValidation:数据校验
- Serilog:日志管理(使用seq连接)
- Autofac : 依赖注入
- Mediator.Net : 中介者
- 2、详细说明
autoMapper:字段映射
1、快速使用
1、安装库
AutoMapper
AutoMapper.Extensions.Microsoft.DependencyInjection
2、在原始数据类下面创建一个映射类
public class User
{
public int id { get; set; }
public string? name { get; set; }
public string? gender { get; set; }
public string? phone { get; set; }
}
public class UserDto
{
public int id2 { get; set; }
public string? name2 { get; set; }
public string? gender { get; set; }
//public string? phone { get; set; }
}
3、新建一个继承自AutoMapper的Profile类,定义映射字段
//继承自AutoMapper的Profile类
public class UserProfile:Profile
{
public UserProfile() {
//将源数据映射到DTO
CreateMap<User, UserDto>()
.ForMember(userdto => userdto.id2, opt => opt.MapFrom(user => user.id))
.ForMember(userdto => userdto.name2, opt => opt.MapFrom(user => user.name));
//将DTO映射到数据源
CreateMap<UserDto,User>()
.ForMember(user => user.id, opt => opt.MapFrom(userdto => userdto.id2))
.ForMember(user => user.name, opt => opt.MapFrom(userdto => userdto.name2));
;
}
}
4、Programs.cs文件里面注册注入对象
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
5、最后就是在Controller里面应用啦
//映射为实体
var trueUser = _mapper.Map<User>(user);
2、详细说明
资料:
https://www.cnblogs.com/youring2/p/automapper.html
https://github.com/AutoMapper/AutoMapper
FluentValidation:数据校验
1、快速使用
1、安装库
Framework 安装FluentValidation版本
core安装FluentValidation.AspNetCore版本
2、创建验证器
public class UserValidator:AbstractValidator<UserDto>
{
public UserValidator()
{
//RuleFor(o=>o.Name)指定对哪个属性进行验证
RuleFor(o=>o.name2).NotEmpty().WithMessage("姓名不能为空!");
RuleFor(o => o.gender).NotEmpty().WithMessage("性别不能为空").Must(BeAValidGender).WithMessage("只能填写男or女");
//RuleFor(o => o.phone).Length(11).WithMessage("手机号填写错误");
}
private bool BeAValidGender(string gender)
{
return gender == "男" || gender == "女";
}
}
3、使用
var validator = new UserValidator();
var val = validator.Validate(user);
if (!val.IsValid)
{
//var errors = val.Errors.ToDictionary(e => e.PropertyName, e => new[] { e.ErrorMessage });
return ValidationProblem();
}
2、详细说明
https://www.cnblogs.com/xiaoxiaotank/p/15657240.html
Serilog:日志管理(使用seq连接)
1、快速应用
可以用docker安装seq:https://www.runoob.com/docker/docker-tutorial.html
1、安装库
Serilog.Sinks.Seq
Serilog.AspNetCore
2、配置
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information() //设置最小日志级别是information
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.Enrich.FromLogContext() //自动将当前执行上下文中的键值对添加到每个日志文件中
.WriteTo.Console()
.WriteTo.Seq("http://localhost:5341/")
.CreateLogger();
try
{
Log.Information("启动网络应用程序");
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog(); //通过Serilog管道重新定向所有日志事件
...
}
catch(Exception e)
{
Log.Fatal(e, "应用程序意外终止");
}
finally
{
Log.CloseAndFlush();
}
3、使用
Log.Information("sc1与sc2的引用比较结果为:{0},sc1={1},sc2={2}",Object.ReferenceEquals(_implsc1, _implsc2),_implsc1.id, _implsc2.id);
2、详细说明
Autofac : 依赖注入
本身.net框架也有内置的DI,但是Autofac会更加灵活,可操作性会更好
1、使用流程
- 安装程序包
- 创建ContainerBuilder
- 注册抽象与实现关系
- build一下得到Container容器
- 通过容器获取服务实例
- 使用服务
2、快速使用
1、安装库
Autofac
Autofac.Extensions.DependencyInjection
2、创建AutoFacModuleRegister.cs编写注册服务相关代码
重新写Load方法,不用自己去创建ContainerBuilder,后面配置的时候也不用build
public class AutoFacModuleRegister:Autofac.Module
{
// 重新写Autofac管道load方法,在这里注册注入
protected override void Load(ContainerBuilder builder)
{
//根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) //静态方法获取当前正在执行的程序集
.Where(t => t.Name.EndsWith(("Service")))
.AsImplementedInterfaces(); //扩展方法,返回一个IEnumerable
}
}
3、在Program.cs中配置注册
//Autofac注入
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule((new AutoFacModuleRegister()));
});
4、使用
跟框架内置DI使用方法一样
[ApiController] //指示控制器响应 Web API 请求
[Route("api/[controller]")]
public class AutoController:Controller
{
private readonly implService[] _ser;
public AutoController(implService[] ser)
{
_ser = ser;
}
[HttpGet]
public string Getmsg()
{
string msg1 = _ser[0].sendMsg();
string msg2 = _ser[1].sendMsg();
return msg1+"+"+msg2;
}
}
3、详细说明
https://autofac.org/
https://juejin.cn/post/7032682892337610759
https://autofac-.readthedocs.io/en/latest/register/registration.html
https://www.cnblogs.com/sunshine-wy/p/15757914.html
https://www.cnblogs.com/fanfan-90/p/12014055.html
Mediator.Net : 中介者
使用 MediatR 可实现消息的发送和处理充分解耦,这是在业务处理逻辑层面上的解耦
1、快速使用
1、安装库
Mediator.Net
2、写request
public class requestModule:IRequest
{
public int Number { get; set; }
public requestModule(int num)
{
Number = num;
}
}
3、写对应的response
public class ResponseModel:IResponse
{
public string Description { get; set; }
}
4、写处理内部逻辑的handle
public class RequestHandle : IRequestHandler<requestModule, ResponseModel>
{
public Task<ResponseModel> Handle(IReceiveContext<requestModule> context, CancellationToken cancellationToken)
{
Console.WriteLine("get test hhhhh");
return Task.FromResult(new ResponseModel() { Description = "testResponse" });
}
}
5、注册MediaR
https://github.com/mayuanyang/Mediator.Net
- 方法一:Mediator.Net.Autofac
public class AutoFacModuleRegister:Autofac.Module
{
// 重新写Autofac管道load方法,在这里注册注入
protected override void Load(ContainerBuilder builder)
{
//根据名称约定(服务层的接口和实现均以Service结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) //静态方法获取当前正在执行的程序集
.Where(t => t.Name.EndsWith(("Service")))
.AsImplementedInterfaces(); //扩展方法,返回一个IEnumerable
//注册mediator
builder.RegisterMediator(MakeMediatorBuilder());
}
//返回mediator所需要的mediaBuilder
public static MediatorBuilder MakeMediatorBuilder()
{
var mediaBuilder = new MediatorBuilder();
mediaBuilder.RegisterHandlers(typeof(RequestHandle).Assembly).Build();
return mediaBuilder;
}
}
- 方法二:蹲坑。。。想要用原始的DI注入,还没查到怎么做!
写了个无意义的代码,暂时没想到更好的
2、详细说明
以下是官网源码中一个小demo,可看关联关系理解
第一个链接是正确的,看github里面的代码示例理解的比较快
Mediator.Net而不是Mediator,第二个链接是Mediator,可以看看思路
https://github.com/mayuanyang/Mediator.Net
https://tech.playgokids.com/cqrs-with-mediatr-and-autofac-net6/
shouldly:测试框架
主项目所需要的依赖注入,都需要在测试项目中注入一遍。即注入容器的环境要构造的与主项目的注入容器环境一致。
1、快速使用
不用配置,在想要比较的变量后边.shouldXXX(); 就可以了
2、详细说明
https://github.com/shouldly/shouldly
Respawn:清空数据表
private Respawner _respawner;
private MySqlConnection _conn;
//配置
_conn = new MySqlConnection(connectionString);
await _conn.OpenAsync();
_respawner = await Respawner.CreateAsync(_conn, new RespawnerOptions
{
DbAdapter = DbAdapter.MySql,
//SchemasToExclude = new[] { "customerdb.schemaversions" }
TablesToInclude = new Table[]{"customer_table","schemaversions"}
});
。。。
//使用
await _respawner.ResetAsync(_conn);
_conn.Close();
QR Code Generator 在线生成二维码(前端)
data是二维码所携带的信息
<!DOCTYPE html>
<html>
<head>
<title>QR Code Example</title>
</head>
<body>
<!-- 创建包含HTML链接的二维码 -->
<img src="https://api.qrserver.com/v1/create-qr-code/?data=https://baidu.com" alt="QR Code">
</body>
</html>