博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【翻译】asp.net core中使用MediatR
阅读量:6757 次
发布时间:2019-06-26

本文共 3966 字,大约阅读时间需要 13 分钟。

原文:

这篇文章来自: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,那么你可以按照上面代码中注释掉的那样来配置。

注意:起初我用了这个指引,但是包得到了更好的支持和更健壮的成长(更别说更少的代码)。我建议使用这个包。

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
{ private readonly ILogger
_logger; public Handler1(ILogger
logger) { _logger = logger; } public void Handle(SomeEvent notification) { _logger.LogWarning($"Handled: {notification.Message}"); }}public class Handler2 : INotificationHandler
{ private readonly ILogger
_logger; public Handler2(ILogger
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
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
{} public class PingHandler : IRequestHandler
{ public string Handle(Ping request) { return "Pong"; }}// optional to show what happens with multiple handlerspublic class Ping2Handler : IRequestHandler
{ public string Handle(Ping request) { return "Pong2"; }}

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

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

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

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

public async Task
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(微软示例项目,讲微服务的)项目当中了。查看这里 去获取更多微软的相关技术的书书籍吧。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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"
;
    
}
}

转载地址:http://afzeo.baihongyu.com/

你可能感兴趣的文章
关于c语言的输入输出
查看>>
(三)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划
查看>>
OC语言 关于description的探讨
查看>>
windows串口通信的一个活动图
查看>>
递归算法题
查看>>
【Algorithm】转一个ACM训练计划
查看>>
HashSet其实就那么一回事儿之源码浅析
查看>>
浏览器的标准模式和怪异模式
查看>>
[C#]分享一个以前的项目使用的DataBaseAccess类
查看>>
POJ-2236-Wireless Network
查看>>
ASP.NET引用母版页属性的问题
查看>>
JavaScript 模块模式
查看>>
链接返回上级或事件返回上级
查看>>
ROS学习之catkin_make
查看>>
Android中的颜色值RGB对照表表
查看>>
css单位
查看>>
jquery.validate remote BUG
查看>>
一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
查看>>
C/C++变量命名规则
查看>>
pandas安装及使用
查看>>