在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此,我们将通过下面的主题来进行相关的讲解。
什么是命令模式?
命令模式的简单实例以及中介者模式的简单描述
MVC中的瘦控制器是什么?我们是如如何实现使控制器变瘦的?
我们如何在我们的.NET Core应用程序中使用MediatR
使用命令和事件的实例
命令模式及其简单实例
从根本上讲,命令模式是一种数据驱动的设计模式,属于行为模式的范畴。命令是我们可以执行的某种操作或行为,它可以是活动的一部分。一个活动可以有一个或多个命令和实现。
我们可以这样来说,请求以命令的形式包裹在对象中,并传给调用对象。调用者(代理)对象查找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令 。
一个简单的例子是多种类型的消息。Message类包含SendEmail()和SendSms()等属性和方法。使用两种类型的命令,并且需要一个接口,它应该由实现了EmailMessageCommand和SMSMessageCommand的类类继承。还使用代理类来调用特定类型的消息类来处理操作。

Main class
class Program
{
static void Main(string[] args)
{
Message message = new Message();
message.CustomMessage = "Welcome by Email";
EmailMessageCommand emailMessageCommand = new EmailMessageCommand(message);
Message message2 = new Message();
message2.CustomMessage = "Welcome by SMS";
SmsMessageCommand smsMessageCommand = new SmsMessageCommand(message2);
Broker broker = new Broker();
broker.SendMessage(emailMessageCommand);
broker.SendMessage(smsMessageCommand);
Console.ReadKey();
}
}
消息类
public class Message
{
public string CustomMessage { get; set; }
public void EmailMessage()
{
Console.WriteLine($"{CustomMessage} : Email Message sent");
}
public void SmsMessage()
{
Console.WriteLine($"{CustomMessage} : Sms Message sent");
}
}
接口和代理类
public interface IMessageCommand
{
void DoAction();
}
public class Broker
{
public void SendMessage(IMessageCommand command)
{
command.DoAction();
}
}
命令
public class EmailMessageCommand : IMessageCommand
{
private Message oMessage;
public EmailMessageCommand(Message oMessage)
{
this.oMessage = oMessage;
}
public void DoAction()
{
oMessage.EmailMessage();
}
}
public class SmsMessageCommand : IMessageCommand
{
private Message oMessage;
public SmsMessageCommand(Message oMessage)
{
this.oMessage = oMessage;
}
public void DoAction()
{
oMessage.SmsMessage();
}
}
输出

什么是瘦控制器,我们为什么需要它?什么是
MediatR?
当我们开始使用MVC框架进行开发时,逻辑是用控制器的动作方法编写的;就像我们有一个简单的电子商务应用程序,其中用户应该会下订单。我们有一个控制器,OrderController,用来管理订单。当用户下订单时,我们应该在数据库中保存记录。
在此之前,我们有一个简化的代码。然而,经过一段时间后,我们意识到还有一个确认电子邮件的业务需求。现在,第二步是发送确认电子邮件给客户。后来,我们意识到,在这个步骤之后,我们还需要执行另一个操作,即,记录信息等。最后,我们还需要将用户的信息保存到CRM中。关键是它会增长控制器的大小。现在,我们可以称之为“臃肿控制器”。
基于命令的体系结构允许我们发送命令来执行某些操作,并且我们有单独的命令处理程序,使关注点分离和提高单一职责。为了实现这个架构,我们可以使用第三方库,比如MediatR(Mediator.),它为我们做了很多基础工作。中介模式定义了一个对象,该对象封装了一组对象是如何交互的。
中介模式的优势及MediatR如何帮助我们实现中介模式
中介模式定义了一个对象,该对象封装了一组对象是如何交互的(如维基百科定义的)。
它通过保持对象彼此明确地相互引用来促进松散耦合。
它通过允许通信被卸载到一个只处理这类的类来促进单一责任原则。
MediatR库如何帮助我们
MediatR允许我们通过让控制器Action向处理程序发送请求消息来将控制器与业务逻辑解耦。MediatR库支持两种类型的操作。
(预期输出结果)
事件(请求者不关心接下来发生了什么,不期待结果)
我们已经介绍了命令模式,因此是时候定义一些命令并使用MediatR发出命令了。
在ASP.NET Core中安装
我们需要从NuGet安装MediatR和MediatR.Extensions.Microsoft.DependencyInjection包。