为什么应该在业务层实现管道模式,而不用ASP.NET Core Middleware实现 | 2点原因和实现方式...

前言

ASP.NET Core的Middleware(中间件)就是使用了管道模式:

5a12fb0357789e3a384aafe1d6430d25.png

Request(请求)在管道中传递,依次经过管道中的每一个MiddleWare进行处理。

MiddleWare就像一层层的“滤网”,过滤所有的请求和响应。

这种模式的好处在于,分离关注点。比如验证用户、记录访问日志,可以将这些任务分解到不同MiddleWare中,互相解耦。

既然ASP.NET Core已经实现了管道模式,为什么还要在业务层实现一遍呢?

原因

我觉得可以分为2方面考虑:

  • 与顶级框架解耦,不能保证应用程序代码始终运行在ASP.NET Core下,如果将业务迁移到WPF,记录访问日志这类放在管道中的功能还是需要实现

  • 同时支持不同来源请求,请求可能来自于Web API,也可能来自于Windows Service定时调用,但业务层处理逻辑应保持一样

因此,ASP.NET Core框架应该只用于接收输入和返回输出,而在业务层实现管道模式。

定义API的最佳实践

在《定义API的最佳实践MediatR类库实现Controller方法,将业务逻辑和Controller进行隔离。

示例代码如下:

[HttpGet]
public async Task<string> Demo([FromQuery] DemoQuery request)
{
    return await _mediator.Send(request);
}


public class DemoQuery : IRequest<string>
{
    public string Name { get; set; }
}

public class DemoQueryHandler : IRequestHandler<DemoQuery, string>
{ 
    public async Task<string> Handle(DemoQuery request, CancellationToken cancellationToken)
    {
        Console.WriteLine("DemoQueryHandler执行");
        return request.Name;
    }
}

而MediatR不仅仅是一个简单的中介模式实现,它还提供了Behaviors的概念:

3311316315de2012951aff00456d2cd2.png

Behaviors非常类似于ASP.NET Core中的MiddleWare,可以让我们实现管道模式。

管道实现

要定义Behaviors,我们需要实现IPipelineBehavior接口,示例代码如下:

public class FirstPipelineBehavior<TRequest, TResponse>
    : IPipelineBehavior<TRequest, TResponse>
{
    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        Console.WriteLine("FirstPipelineBehavior执行中");

        var response = await next();

        Console.WriteLine("FirstPipelineBehavior执行完成");

        return response;
    }
}

和MiddleWare类似,调用next()可以将请求向下传递。

接着在Startup.cs中注册管道:

services.AddMediatR(typeof(Startup));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(FirstPipelineBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(SecondPipelineBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ThirdPipelineBehavior<,>));

访问API可以看到,管道可以在IRequestHandler执行之前和之后执行代码,并且处理顺序和注册顺序相同

05c9b90eb662a44be68467a802f7f4f9.png

结论

通过本文,我们了解到,通过MediatR提供的Behaviors功能,不依赖ASP.NET Core框架,可以在业务层实现管道模式。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值