[译]使用Command模式和MediatR简化你的控制器

Posted irocker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[译]使用Command模式和MediatR简化你的控制器相关的知识,希望对你有一定的参考价值。

原文

你希望保持你的controller足够简单。

你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案。

但是你不知道command模式是否适合你的应用。应该有多少command?

特性

command模式最好的一点是你可以先不管业务的实现,先聚焦于用户交互界面。

假设你创建了一个网站,有一个功能是注册和登陆。

Hello MediatR

实现command模式非常简单,特别是当你使用了Jimmy Bogard’s MediatR来发送来自MVC/API controller的command。

使用MediatR你一开始可以创建一个简单的类来代表你的命令。

public class RegisterUser : IRequest<bool>
{
    public string EmailAddress { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

bool参数表示你的命令将返回bool类型。

然后你可以在controller里面使用MediatR来发送这个命令。

public class UserController : Controller
{
    private readonly IMediator _mediator;

    public UserController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    public ActionResult Register(RegisterUser registerUser)
    {
        bool registered = _mediator.Send(registerUser);
        return View();
    }
}

要点

职责分离了。你不需要将仓储、应用服务等放到你的控制器里面去,你需要的仅仅是Mediator

模型绑定自动填充command对象 (RegisterUser)。

如此一来确保了你的controller是简单的,controller聚焦于处理转发请求。

那么怎么处理command呢?非常简单,创建一个handler即可!

public class RegisterUserHandler : IRequestHandler<RegisterUser, bool>
    {
        public bool Handle(RegisterUser message)
        {
            // save to database
            return true;
        }
    }

以上是关于[译]使用Command模式和MediatR简化你的控制器的主要内容,如果未能解决你的问题,请参考以下文章

ABP CQRS 实现案例:基于 MediatR 实现

MediatR CQRS模式解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.

MediatR CQRS模式解决将消息发送与消息处理进行了解耦,他同时支持异步和同步来发送和监听消息.

[译]A NON-TRIVIAL EXAMPLE OF MEDIATR USAGE

C#设计模式之12:中介者模式

Spring 版MediatR--中介者模式实现库