(精华)2020年9月20日 ASP.NET Core MediatR进程内的消息通信框架的使用
发布日期:2021-06-29 15:12:25
浏览次数:2
分类:技术文章
本文共 5214 字,大约阅读时间需要 17 分钟。
MediatR介绍
.NET中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过C#泛型支持消息的智能调度。
首先引入两个类库MediatRMediatR.Extensions.Microsoft.DependencyInjection
第一种使用方式:CQRS
Handlers
public class MakeOrderCommandHandler : IRequestHandler{ public Task Handle(MakeOrderRequestModel request, CancellationToken cancellationToken) { var result = new MakeOrderResponseModel { IsSuccess = true, OrderId = new Guid("53d26807-ad70-4449-8479-024c54eb2020") }; // 业务逻辑 return Task.FromResult(result); }}
public class GetOrderByIdQueryHandler : IRequestHandler{ public Task Handle(GetOrderByIdRequestModel request, CancellationToken cancellationToken) { var orderDetails = new GetOrderByIdResponseModel(); // 业务逻辑 return Task.FromResult(orderDetails); }}
RequestModels
public class MakeOrderRequestModel : IRequest{ public Guid OrderId { get; set; } public string OrderName { get; set; } public DateTime DateOrder { get; set; } public Guid ProductId { get; set; } public int Quantity { get; set; } public double Amount { get; set; } public Guid OrderPersonId { get; set; }}
public class GetOrderByIdRequestModel : IRequest{ public Guid OrderId { get; set; }}
ResponseModels
public class MakeOrderResponseModel{ public bool IsSuccess { get; set; } public Guid OrderId { get; set; }}
public class GetOrderByIdResponseModel{ public Guid OrderId { get; set; } public string OrderName { get; set; } public DateTime DateOrder { get; set; } public Guid ProductId { get; set; } public int Quantity { get; set; } public double Amount { get; set; } public Guid OrderPersonId { get; set; } public string ProductName { get; set; } public string OrderPersonName { get; set; }}
注入
public class Startup{ public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddMediatR(Assembly.GetExecutingAssembly()); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }}
使用
[Route("api/[controller]")][ApiController]public class OrderController : ControllerBase{ private readonly IMediator _mediator; public OrderController(IMediator mediator) { _mediator = mediator; } [HttpPost] public IActionResult MakeOrder([FromBody] MakeOrderRequestModel requestModel) { var response = _mediator.Send(requestModel).Result; return Ok(response); } [HttpGet] public IActionResult OrderDetails(Guid id) { var response = _mediator.Send(new GetOrderByIdRequestModel { OrderId = id}).Result; return Ok(response); }}
第二种使用方式:发布订阅模式
Handlers
public class GeneralNotificationHandler : INotificationHandler{ public Task Handle(GeneralNotificationModel notification, CancellationToken cancellationToken) { Console.WriteLine($"{notification.Title}:{notification.Content}"); return Task.CompletedTask; }}public class LogHandler : INotificationHandler { private readonly ILogger _logger; public LogHandler(ILogger logger) { _logger = logger; } public Task Handle(GeneralNotificationModel notification, CancellationToken cancellationToken) { _logger.LogInformation($"{notification.Title}:{notification.Content}"); return Task.CompletedTask; }}
NotificationModels
public class GeneralNotificationModel : INotification{ public string Title { get; set; } public string Content { get; set; } public GeneralNotificationModel(string title, string content) { Title = title; Content = content; }}
使用
public class MakeOrderCommandHandler : IRequestHandler{ private readonly IMediator _mediator; public MakeOrderCommandHandler(IMediator mediator) { _mediator = mediator; } public Task Handle(MakeOrderRequestModel request, CancellationToken cancellationToken) { var result = new MakeOrderResponseModel { IsSuccess = true, OrderId = new Guid("53d26807-ad70-4449-8479-024c54eb2020") }; //发布 _mediator.Publish(new GeneralNotificationModel("已下单", result.OrderId.ToString()), cancellationToken); return Task.FromResult(result); }}
转载地址:https://codeboy.blog.csdn.net/article/details/108524529 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月21日 01时24分12秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用git2consul将git中的配置信息同步到Consul中
2019-04-30
安装git2consul
2019-04-30
Windows10禁止一些自带应用后台运行
2019-04-30
探索Mysql json数据类型及使用
2019-04-30
API网关对比与选择
2019-04-30
Spring Cloud Gateway是什么?
2019-04-30
不同维度架构的分类及关系
2019-04-30
Windows11镜像下载地址
2019-04-30
罗技MX MASTER 2S无线鼠标入门指南
2019-04-30
尚硅谷SpringCloud(H版&alibaba)框架开发教程
2019-04-30
Intel(R) CFL Mobile/DeskTop Gra显卡驱动
2019-04-30
Mac上的隐藏文件的显示与隐藏
2019-04-30
远程桌面不能复制粘贴解决办法
2019-04-30
Mac JDK1.6(下载 - Java for OS X 2017-001)
2019-04-30
MAC OS查看端口占用情况及杀死进程
2019-04-30
关于SVN提交时报out-of-date错误的解决方法
2019-04-30
软件测试的四个阶段,单元测试、集成测试、系统测试、验收测试
2019-04-30
基于Ubuntu的Java开发环境配置向导
2019-04-30
Tomcat6 基本安全设置
2019-04-30