(精华)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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(精华)2020年9月20日 ASP.NET Core WebAPI数据协议GraphQL的使用
下一篇:(精华)2020年9月21日 ASP.NET Core AutoMapper的使用

发表评论

最新留言

不错!
[***.144.177.141]2024年04月21日 01时24分12秒