[译]使用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;
}
}