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、详细说明

https://serilog.net/

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,可看关联关系理解
无标题(1).png

第一个链接是正确的,看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>

Hangfire 任务调度框架

中文文档

System.Linq.Dynamic.Core

文档

最后编辑:2023年12月12日 ©著作权归作者所有