张家口网站建设公司,电商网站设计思想,静态网站提交表单怎么做,北京比较好的网站公司前言上次#xff0c;我们介绍了使用MediatR的Behaviors功能#xff0c;在业务层实现管道模式。(《为什么应该在业务层实现管道模式#xff0c;而不用ASP.NET Core Middleware实现 | 2点原因和实现方式》)但是#xff0c;这种管道有个特点或者说缺点#xff0c;不管你需不需… 前言上次我们介绍了使用MediatR的Behaviors功能在业务层实现管道模式。(《为什么应该在业务层实现管道模式而不用ASP.NET Core Middleware实现 | 2点原因和实现方式》)但是这种管道有个特点或者说缺点不管你需不需要所有请求都要经过管道处理而且处理顺序必须一致。下面我们介绍一种更轻量的实现方式。BrighterBrighter一个命令处理器和调度程序实现支持任务队列的轻量级类库。它的使用方式和MediatR类似同样可以实现业务逻辑和Controller进行隔离。1.引用nuget包创建Web API项目并引用nuget包Paramore.Brighter.AspNetCore。2.定义请求数据添加一个新类DemoCommand实现IRequest接口:public class DemoCommand : IRequest
{public Guid Id { get; set; }public string Name { get; set; }
}3.实现请求处理程序添加一个新类DemoCommandHandler继承基类RequestHandlerTRequestTRequest对应实现了IRequest接口的类:public class DemoCommandHandler : RequestHandlerDemoCommand
{public override DemoCommand Handle(DemoCommand command){Console.WriteLine(DemoQueryHandler执行);return base.Handle(command);}
}4.实现APIController没有任何业务逻辑仅将请求通过commandProcessor发送private readonly IAmACommandProcessor _commandProcessor;
public WeatherForecastController(IAmACommandProcessor commandProcessor)
{_commandProcessor commandProcessor;
}[HttpPost]
public void Demo(DemoCommand command)
{_commandProcessor.Send(command);
}5.添加Brighter配置打开Startup.cs在ConfigureServices方法中添加如下代码services.AddBrighter().HandlersFromAssemblies(typeof(Startup).Assembly);6.运行运行程序访问API地址可以看到输出正常说明请求已通过Brighter发送给请求处理程序处理。实现独立管道Brighter提供了一种被称为俄罗斯套娃的模型可以将多个RequestHandler串联起来执行同一个请求比如为DemoCommandHandler加上LogHandler写日志和ValidateHandler检查请求参数合法性。这就相当于为每个请求处理程序提供了一条独立管道。要实现俄罗斯套娃我们必须创建一个Attribute来继承RequestLoggingAttribute:public class FirstPipelineAttribute: RequestHandlerAttribute
{public FirstPipelineAttribute(int step, HandlerTiming timing): base(step, timing){ }public override Type GetHandlerType(){return typeof(FirstPipelineHandler);}
}public class FirstPipelineHandlerTRequest : RequestHandlerTRequest where TRequest: class, IRequest
{public override TRequest Handle(TRequest request){Console.WriteLine(FirstPipelineHandler执行);return base.Handle(request);}
}step 定义在管道中的执行顺序timing 在请求处理程序之前还是之后执行GetHandlerType() 返回具体处理方法的实现同样要继承自RequestHandlerTRequest然后在具体的Handle声明这些Attribute[FirstPipeline(1, HandlerTiming.Before)]
[SecondPipeline(2, HandlerTiming.Before, typeof(SecondPipelineHandler))]
[SecondPipeline(3, HandlerTiming.After, typeof(ThirdPipelineHandler))]
public override DemoCommand Handle(DemoCommand command)可以看到管道的处理顺序和step、timing的设置相同结论通过本文我们可以了解到Brighter可以为每个请求实现独立的管道这样可以更灵活地控制管道执行的内容和顺序。想了解更多内容请关注我的个人公众号”My IO“