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

使用Mediatr在ASP.NET核心中的命ä"¤ï¼Œä"‹ä½“模式

使用Mediatr在ASP.NET核心中的命ä"¤ï¼Œä"‹ä½“模式

当这两个软件包安装完毕后,我们需要添加services.AddMediatR(); 到startup.cs文件。看起来像这样。

使用Mediatr在ASP.NET核心中的命ä"¤ï¼Œä"‹ä½“模式

现在,我们可以使用.NET Core 项目中的MediatR了。

实例

第一个示例演示了使用MediatR使用请求/响应类型的操作。它期望对请求做出一些反应。
第二个示例将向您展示一个事件,其中多个处理程序执行它们的工作,调用者并不关心接下来会发生什么,也不期望任何结果/响应。

第一个例子

在这种场景下,我们希望注册用户并期望对请求做出一些响应。如果响应返回true,我们可以像登录用户一样进行进一步的操作。
首先,我们需要创建一个继承自IRequest的类。

public class NewUser: IRequest<bool> { public string Username { get; set; } public string Password { get; set; } }

IRequest是指请求的响应是布尔响应。
现在,需要一个处理程序来处理这种类型的请求。

public class NewUserHandler : IRequestHandler<NewUser, bool> { public Task<bool> Handle(NewUser request, CancellationToken cancellationToken) { // save to database return Task.FromResult(true); } }

现在我们有了命令和它的处理程序,我们可以调用MediatR在我们的控制器中做一些操作。
这些是Home控制器的动作方法。

public class HomeController : Controller { private readonly IMediator _mediator; public HomeController(IMediator mediator) { _mediator = mediator; } [HttpGet] public ActionResult Register() { return View(); } [HttpPost] public ActionResult Register(NewUser user) { bool result = _mediator.Send(user).Result; if (result) return RedirectToAction("Login"); return View(); } } 第一个例子的结论

注册操作方法使用了[HttpPost]属性进行修饰,并接受新的用户注册请求。然后,它请求MediatR 进行处理。它期望来自请求的结果/响应,如果结果是真的,则将用户重定向到登录页面。
这里,我们有简洁的代码,大部分的工作是在控制器外部完成的。这实现了对不同操作的处理的关注点分离(SoC)和单一责任的分离。
在第二个示例中,我们将演示使用多个处理程序对命令执行不同操作的场景。

第二个实例

在这种情况下,我们使NewUser 继承了INotification

public class NewUser : INotification { public string Username { get; set; } public string Password { get; set; } }

现在,有三个处理程序逐个执行,以完成他们的工作。这些都是从INotificationHandler继承下来的。

public class NewUserHandler : INotificationHandler<NewUser> { public Task Handle(NewUser notification, CancellationToken cancellationToken) { //Save to log Debug.WriteLine(" **** Save user in database *****"); return Task.FromResult(true); } }

第二个处理程序在下面的代码中定义。

public class EmailHandler : INotificationHandler<NewUser> { public Task Handle(NewUser notification, CancellationToken cancellationToken) { //Send email Debug.WriteLine(" **** Email sent to user *****"); return Task.FromResult(true); } }

这是第三个处理程序的代码

public class LogHandler : INotificationHandler<NewUser> { public Task Handle(NewUser notification, CancellationToken cancellationToken) { //Save to log Debug.WriteLine(" **** User save to log *****"); return Task.FromResult(true); } }

然后,我们控制器中的代码像下面这样

public class AccountsController : Controller { private readonly IMediator _mediator; public AccountsController(IMediator mediator) { _mediator = mediator; } [HttpGet] public ActionResult Login() { return View(); } [HttpGet] public ActionResult Register() { return View(); } [HttpPost] public ActionResult Register(NewUser user) { _mediator.Publish(user); return RedirectToAction("Login"); } } 第二个例子的结论

此应用程序的输出如下:
当用户注册后,三个处理程序逐个执行——分别是NewUserHandler、EmailHandler和LogHandler,并执行它们的操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxyys.html