mediatR使用心得

MediatR是什么?

MediatR使用中介者模式来解耦类与类依赖的库,选用设计模式种经典的观察者模式。
MediatR是怎么解决耦合的呢,就好比:两个人对话,使用一个第三者作为传声器那么这个第三者就被成为终结者,两个人的对话就相当于订阅和发布。

单播通信

单播通信再MediatR中主要使用IRequestRequest这两个抽象来作为单播通信的媒介,而使用IRequestHandlerRequestHandlerAsyncRequestHandler作为单播通信媒介的订阅方。举个例子:

// 使用IRequest的单播通信媒介
public class Jing : IRequest
{
    public string Message { get; set; }
}

// 媒介是Jing的单薄通信订阅方
public class JingHandler : AsyncRequestHandler<Jing>
{
    protected override Task Handle(Jing request, CancellationToken cancellationToken)
    {
        Console.WriteLine($"--- Handled Jing: {request.Message}, no Jong");
        return Task.CompletedTask;
    }
}

// 发布
await mediator.Send(new Jing { Message = "Jing" });

单播通信是通常项目中解耦的手段之一,可实现两个类或类库完全解除依赖,两者通信靠MediatR来完成,能有效地避免依赖注入时的循环依赖问题

广播

广播在数据传输层面指的是在一条总线上一个主机的通信会传递到该总线下所有的其他主机。而在MediatR中广播指的是订阅了同一个广播媒介的对象,主要使用INotification作为广播订阅的媒介,而使用INotificationHandler作为广播通信的处理程序,举个例子:

// 以INotification作为广播通信媒介
public class Pinged : INotification
{
    public string Message { get; internal set; }
}

// 订阅方式1:指定广播媒介订阅
public class PingedHandler : INotificationHandler<Pinged>
{
    public Task Handle(Pinged notification, CancellationToken cancellationToken)
    {
        Console.WriteLine("Got pinged async.");
        return Task.CompletedTask;
    }
}

// 订阅方式2:指定继承关系的广播媒介订阅
public class ConstrainedPingedHandler<TNotification> : INotificationHandler<TNotification>
 where TNotification : Pinged
{
    public Task Handle(TNotification notification, CancellationToken cancellationToken)
    {
        Console.WriteLine("Got pinged constrained async.");
        return Task.CompletedTask;
    }
}

广播可用来处理一个属性的变动会引发一系列的其他操作且这些操作并行存在,可以极大程度的降低耦合和依赖。

异常处理

MediatR提供了在通信过程中(单播和广播不限),对于异常的处理方式。使用异常时需要提前向依赖注入的容器注入RequestExceptionActionProcessorBehaviorMediatR中对于异常的处理常用的有3个抽象,分别是AsyncRequestExceptionHandler<TRequest, TResponse>(异步处理所有类型的异常)RequestExceptionHandler<TRequest, TResponse, TException>(同步处理指定基类的异常)RequestExceptionHandler<TRequest, TResponse>(同步处理所有类型的异常)

public class GenericExceptionHadnler<TRequest, TResponse, TException> : RequestExceptionHandler<TRequest, TResponse, TException>
where TRequest : notnull
where TException : Exception
{
   protected override void Handle(TRequest request, TException exception, RequestExceptionHandlerState<TResponse> state)
   {
       Console.WriteLine(exception.Message);
   }
}

以上三个抽象类实现的接口分别是IRequestExceptionHandler<in TRequest, TResponse, TException>(指定异常类型的处理接口)IRequestExceptionHandler<in TRequest, TResponse>(任意异常类型的处理接口)

管道

MediatR提供了在通信之前和之后这条管道的AOP操作接口,分别是IRequestPreProcessor(通信前做的事)IRequestPostProcessor(通信后做的事),这两者使用之前需要将IPipelineBehavior注册进管道;IPipelineBehavior对应处理前后在MediatR有其抽象实现类分别是RequestPreProcessorBehaviorRequestPostProcessorBehavior,举个例子

// 定义自己对与管道的处理行为
public class GenericPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
	public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
	{
	    Console.WriteLine("-- Handling Request");
	    var response = await next();
	    Console.WriteLine("-- Finished Request");
	    return response;
	}
}

// 定义自己的通信前处理程序
public class GenericRequestPreProcessor<TRequest> : IRequestPreProcessor<TRequest>
{
    public Task Process(TRequest request, CancellationToken cancellationToken)
    {
        Console.WriteLine("- Starting Up");
        return Task.CompletedTask;
    }
}

// 定义自己的通信前处理程序
public class GenericRequestPostProcessor<TRequest, TResponse> : IRequestPostProcessor<TRequest, TResponse>
{
    public Task Process(TRequest request, TResponse response, CancellationToken cancellationToken)
    {
        Console.WriteLine("- Finished");
        return Task.CompletedTask;
    }
}

源码见:MediatR
例子见:MediatR/Samples

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinForms MediatR 是一个在 Windows Forms 应用程序中实现 Mediator 模式的库。Mediator 模式是一种行为设计模式,通过减少对象之间的直接耦合,允许对象通过一个中介者对象来进行通信。 使用 WinForms MediatR 可以让我们更好地组织和管理 Windows Forms 应用程序中的消息和事件。它提供了一个中央调度器(Mediator),所有的消息和事件都通过这个中央调度器来处理。这样,我们可以将应用程序的不同部分(视图、控制器等)解耦,并降低它们之间的依赖。 WinForms MediatR 的核心是消息和处理程序。消息是应用程序中的事件和请求,而处理程序则是对这些消息进行响应的方法。中央调度器将消息分发给对应的处理程序,并确保它们按照正确的顺序和逻辑来处理。 使用 WinForms MediatR 可以带来很多好处。首先,它简化了代码结构,使得应用程序的逻辑更加清晰和易于维护。其次,它提供了灵活的扩展性,我们可以轻松地添加和移除消息和处理程序,而不会影响到其他部分的代码。此外,它还提供了更好的测试性,我们可以单独对每个处理程序进行单元测试,而不需要依赖其他部分的代码。 总之,WinForms MediatR 是一个很有用的工具,可以帮助我们更好地组织和管理 Windows Forms 应用程序中的消息和事件。通过减少对象之间的直接耦合,它提供了更清晰、易于维护和扩展的代码结构,同时还提供了更好的测试性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值