【翻译】asp.net core中使用MediatR

这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps

本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作者)的地方,所以在文章中你可以看到一些单词没有进行翻译。如果有不对的地方,请指出,谢谢。

在Asp.net core中使用MediatR

我已经开始考虑使用MediatR作为我的领域事件实现。为了达到这个目的,我用asp.net core创建了一个示例程序,总的来说是非常容易的,如果你之前没有使用过MediatR,或者你正在找一个使用它的示例程序,那么就继续阅读吧。

安装MediatR

假设你使用的是Visual studio,你可以通过nuget的ui来安装下面这两个包:

不是用visual studio的话自己找办法安装吧。

在Startup类中配置MediatR

下一步,在Startup类中,在ConfigureServices方法中添加如下代码:

services.AddMediatR();

// if you have handlers/events in other assemblies
// services.AddMediatR(typeof(SomeHandler).Assembly,
//                     typeof(SomeOtherHandler).Assembly);

在我的示例项目中因为我只有一个工程/程序集,所以没有必要添加其他的。如果你有不只一个程序集需要被配置MediatR,那么你可以按照上面代码中注释掉的那样来配置。

注意:起初我用了Steve Gordon’s helpful article to register my types这个指引,但是MediatR.Extensions.Microsoft.DependencyInjection包得到了更好的支持和更健壮的成长(更别说更少的代码)。我建议使用这个包。

MediatR 实战

当然,如果你想要确认MediatR在你的asp.net core项目中运作,最高的办法是创建一些简单的类型并验证是否能达到预期的效果。MediatR支持两种消息类型:Request/Response和Notification。我使用它的大多数情况是Notification这种模式。因为我希望用它来做模型的领域事件(如果你对于领域事件不熟悉的话,先了解一下它再回来)。要想使用notifications所期望得到的行为,你需要定义一些实现了INotification的类型,和一些实现了INotificationHandler<sometype>的handler。当你要发布一个notification,每一个handler都会在response中。你可以使用下面的代码来实践一下并能看到最终的结果,如果你正在搞一个新项目,你可以把它放到Home Controller中。

public class SomeEvent : INotification {
    public SomeEvent(string message)
    {
        Message = message;
    }

    public string Message { get; }
}

public class Handler1 : INotificationHandler<SomeEvent>
{
    private readonly ILogger<Handler1> _logger;

    public Handler1(ILogger<Handler1> logger)
    {
        _logger = logger;
    }
    public void Handle(SomeEvent notification)
    {
        _logger.LogWarning($"Handled: {notification.Message}");
    }
}
public class Handler2 : INotificationHandler<SomeEvent>
{
    private readonly ILogger<Handler2> _logger;

    public Handler2(ILogger<Handler2> logger)
    {
        _logger = logger;
    }
    public void Handle(SomeEvent notification)
    {
        _logger.LogWarning($"Handled: {notification.Message}");
    }
}

public class HomeController : Controller
{

    private readonly IMediator _mediator;

    public HomeController(IMediator mediator)
    {
        this._mediator = mediator;
    }
    public async Task<IActionResult> Index()
    {
        await _mediator.Publish(new SomeEvent("Hello World"));
        return View();
    }
// more code omitted
}

上面的代码撸完后,使用kestrel运行你的应用(你可以在项目的根目录下面进入cmd然后输入dotnet run来启动一个控制台面板,或者在visual studio中改变启动方式,不过一般情况下我直接进到项目的properties目录下面找到lauchSettings.json,吧IIS相关的东西都删除了。)然后查看你的控制台面板的输出,你应该能看到输出的日志:

如果你只是想用MediatR来发布事件,上面的就是了。如果你想要看看怎么用它来做request/response,你需要在实现几个类:

public class Ping:IRequest<string>{}public class PingHandler : IRequestHandler<Ping, string>
{
    public string Handle(Ping request)
    {
        return "Pong";
    }
}
// optional to show what happens with multiple handlers
public class Ping2Handler : IRequestHandler<Ping, string>
{
    public string Handle(Ping request)
    {
        return "Pong2";
    }
}

上面的代码定义了一个request以及它的返回类型(string,IRequest<string>).handlers必须实现一个Handle方法,这个方法会返回期望的响应。当你发送一个请求,只有一个handler会被调用并且会返回一个带有合适类型的响应。

(作者在这里说明了一个问题,他给这个包的作者发了一个pull request要求如果有注册了多个handler,那么应该调用注册的第一个,因为只有第一个被添加到了DI系统中)。

当前的版本也不会抛出什么异常,但是即便在将来的版本中会抛出异常,也不会让我感到惊讶什么的。

无论以何种方式,要使用上面定义的内容,你只需要在About 方法中添加如下代码:

public async Task<IActionResult> About()
{
    // example of request/response messages
    var result = await _mediator.Send(new Ping());
    ViewData["Message"] = $"Your application description page: {result}";

    return View();
}

从浏览器中浏览/About页面,你能看到调用的结果。目前版本已经更正了结果,你将看到的是注册的第一个(按照你编码的从上到下的顺序,PingHandler是算第一个注册的)handler的返回的结果。

上面就是你要开始研究MediatR的一个很好的开端了。我已经迫不及待的想要将他运用在我的eShopContainer(微软示例项目,讲微服务的)项目当中了。查看这里 Microsoft’s architecture learning hub去获取更多微软的相关技术的书书籍吧。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

publicclassPing:IRequest<string>{}

publicclassPingHandler:IRequestHandler<Ping,string>

{

publicstringHandle(Ping request)

{

return"Pong";

}

}

// optional to show what happens with multiple handlers

publicclassPing2Handler:IRequestHandler<Ping,string>

{

publicstringHandle(Ping request)

{

return"Pong2";

}

}

原文地址:https://www.cnblogs.com/pangjianxin/p/9382696.html

时间: 2024-12-07 05:34:49

【翻译】asp.net core中使用MediatR的相关文章

[译]ASP.NET Core中使用MediatR实现命令和中介者模式

作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁.因此,我们将通过下面的主题来进行相关的讲解. 什么是命令模式? 命令模式的简单实例以及中介者模式的简单描述 MVC中的瘦控制器是什么?我们是如如何实现使控制器变瘦的? 我们如何在我们的.NET Core应用程序中使用MediatR 使用

【翻译】介绍 ASP.NET Core 中的 Razor Pages

介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core         译文地址:介绍 asp.net core 中的 Razor Pages          翻译:ganqiyin Razor Pages 是 ASP.NET Core MVC 的一个新功能,可以让基于页面的编程方案更容易,更高效. 如果您正在寻找使用 Model-View-Controller 的教程,请参阅ASP.NET

[转]ASP.NET Core 中的那些认证中间件及一些重要知识点

本文转自:http://www.qingruanit.net/c_all/article_6645.html 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 ASP.NET Core 认证中会使用到的中间件,还有Authentication的一些零碎知识点,这些知识点对于 ASP.NET 认证体系的理解至关重要. 在 Github 中 ASP.NET C

ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程序提供了处理每个请求的完整控制.Startup 类是应用程序的入口(entry point),这个类可以设置配置(configuration)并且将应用程序将要使用的服务连接起来.开发人员可以在 Startup 类中配置请求管道,该管道将用于处理应用程序的所有请求. 章节: Startup 类 Co

ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入) ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截) 正文 上

NET Core中使用MediatR实现命令和中介者模式

NET Core中使用MediatR实现命令和中介者模式 https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁.因此,我们将通过下面的主题来进行相关的讲解. 什么是命令模式? 命令模式的简单实例以及中介者模式的简单描述 MVC中的瘦控制器是什么?我们是如何实现使控制器变瘦的? 我们如何在我们的.NET Core应

[翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志

原文:[翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.NET Core and Docker 一步一步指导您使用 ElasticSearch, Kibana, ASP.NET Core 2.1 和 Docker 来记录日志 在本教程中,我将向您展示如何启动和运行 ElasticSearch,Kibana 和 ASP.NET Core 2.1 在开始

ASP.NET Core 中的中间件

ASP.NET Core 中的中间件(Middleware) 在这个节中,我们将了解,ASP.NET Core 中的中间件是 什么?中间件很重要,尤其是在你想当架构师这一条路上. ASP.NET Core 中的中间件是 什么? 在 ASP.NET Core 中,中间件(Middleware)是一个可以处理 HTTP 请求或响应的软件管道. ASP.NET Core 中给中间件组件的定位是具有非常特定的用途.例如,我们可能有需要一个中间件组件验证用户,另一个中间件来处理错误,另一个中间件来提供静态

ASP.NET Core中使用Autofac进行属性注入

一些无关紧要的废话: 作为一名双修程序员(自封的),喜欢那种使用Spring的注解形式进行依赖注入或者Unity的特性形式进行依赖注入,当然,形式大同小异,但结果都是一样的,通过属性进行依赖注入. ASP.NET Core中使用了自带的Dependency Injection作为了默认的IOC容器,当然有先天的优势,很多还是喜欢切换到Autofac作为IOC容器,Unity在.Net Core中还是有很大的优势的,但据我所知,Unity5已经由微软转交到基金会了,而且本身文档很少,翻译文档以及研