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

原文地址:https://www.cnblogs.com/irocker/p/7406019.html

时间: 2024-10-21 02:10:40

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

Command模式

在开发中,有时需要向对象发送请求,但是不知道请求的接受者是谁,被请求的操作是什么.这时可以使用command模式. Command模式将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中的Receiveer中.这样实现了操作的对象和操作的具体实现之间的解耦. 实现 Receiver.h #ifndef _RECIEVER_H_ #define _RECIVEER_H_ class Reciever { public: Reciever(); ~

Java命令模式(Command模式)

Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse. Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句

Command模式(C++命令模式)

重新温习GOF23到第19个命令模式了,写下来方便自己理解 用经理,秘书,邮局来理解这个模式还是比较好的. 经理:喂,小丽呀,这儿有封信,请帮我尽快寄出去- 秘书:好的,经理,我马上去办! 秘书拿着这封信,到一家邮局将信寄了出去.邮局最终也将信投递到了收件人手中. 这是一个很常见的生活工作场景,不过这里面:经理.秘书和邮局,三者在不知不觉间,演绎了一出面向对象设计模式:Command模式.Command模式是我打算讲的第一个行为型设计模式. Command模式的内容大致如此: 将一个请求封装成一

Command模式详解--设计模式(18)

Memento模式来源:       Command模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间的解耦. Memento模式作用: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作.由于"行为请求者"与"行为实现者"的紧耦合,使用命令模式,可以对请求排队或记录请求日志,

Command 模式 Step by step

提起Command模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过它来一步步实现GOF的Command模式. 我们先看下这个遥控器程序的需求:假如我们需要为家里的电器设计一个远程遥控器,通过这个控制器,我们可以控制电器(诸如灯.风扇.空调等)的开关.我们的控制器上有一系列的按钮,分别对应家中的某个电器,当我们在遥控器上按下"On"时,电器打开:当我们按下"Off"时,电器关闭. 好了,让我们开始Command 模式之旅吧. HardCoding的实现方式

Aexi(6)-Command模式

这两天我们给Aexi增加了Command模式. 其实我对于Command模式比较少的印象就是可以用来做撤销操作的功能,我看过的所有的书对于这个模式的介绍,都是把它和撤销操作相联系,似乎Command模式是专门为这一功能设计的.Command模式有没有其他的应用呢,我也不太知道,但是既然这里可以用到,那我们就在这里用一下.至于对这个模式更深层次的理解,那就等到遇到相应的问题的时候具体对待了,但是至少得有一个基本的印象才可以. 首先定义Command接口,代码如下: public interface

【行为型】Command模式

命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别好用,现在想想,其实也可以通过命令模式来设计.命令模式主要是将请求抽象成对象,以此作为中间的一个中转站,转达请求命令,从而将请求方与响应方解耦.在逻辑层面上,用户只需要发布自己的命令即可,至于由什么样的响应者来处理,则需要看具体下达的是什么样的命令.模式类结构图参考如下: 模式编码结构参考如下: 1

敏捷软件开发(3)---COMMAND 模式 &amp; Active Object 模式

COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子.也许你会觉得,这有点多此一举吗.但是当你使用他的时候,command模式就会闪现光华. 这样一个场景:经理张三叫leader王二去开发一个项目, 王二就安排李四 去开发这个功能A. 李四何时执行,怎么执行就是他自己的事情了. UML图如上所示: 代码如下: public interface Com

Android学习按键事件监听与Command模式

Android学习按键事件监听与Command模式 - Dufresne - 博客园 ? 一 Command模式 意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作. 将请求被封装成一个对象,当向某对象提交请求时,使我们可以不用去知道被具体的请求的操作或者请求的接收者, 实现了动作的请求者对象和动作的执行者对象之间的解耦合. 适用性: 使用Command模式代替callback形式的回调应用: 在不同的时刻指定.排列和执行请