65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MediatR 库实现中介者模式

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

2023 年 9 月 21 日

CPOL

2分钟阅读

viewsIcon

5214

MediatR 库提供了一种在 .NET 应用程序中实现中介者模式的简单方法。

引言

任何具有相当复杂度的应用程序通常由许多不同的组件相互通信组成。这些组件包含业务逻辑。
这会产生紧耦合,因为我们无法在不影响应用程序其余部分的情况下替换或更改一个组件。

中介者设计模式

中介者是一种行为设计模式,用于管理具有许多不同组件之间紧耦合的应用程序中的复杂性。它有助于消除对象之间的这种紧耦合。这使得应用程序易于维护。

对象不再直接相互通信,而是使用 mediator 对象进行通信。假设我们有组件 A 和 B。A 需要与 B 通信。现在,A 不直接与 B 通信,而是通知 mediator 对象它与 B 通信的意图。然后由 mediator 对象通知 B。这会将所有依赖项集中到 mediator 对象上。

Mediator 类定义了一个单一的 notify 方法,组件使用该方法通过 mediator 对象触发适当的处理程序组件。在接收到发送组件的通知后,mediator 会识别并调用处理程序组件。

.NET 中的 MediatR 库

在 .NET 中,可以使用 MediatR NuGet 包来实现 Mediator 模式。MediatR 库也适用于在 .NET 应用程序中实现 CQRS。

要在应用程序中使用它,需要在应用程序中添加 MediatR NuGet 包。可以使用 包管理器控制台 添加它,如下所示:

Install-Package MediatR

或者使用 NuGet 包管理器

添加依赖项

下一步是在应用程序中添加 MediatR 依赖项。在 .NET 7 应用程序中,可以像这样注入依赖项:

builder.Services.AddMediatR(cfg => 
   cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));   

使用构造函数注入将 mediator 依赖项注入到你的类中

private readonly IMediator _mediator;
  
public MediatorTestController(IMediator mediator)
{
    _mediator = mediator;
}

定义从 IRequest 接口派生的类

这是客户端将传递给 mediatR 的消息。

public class Product : IRequest<string>
 {
     public int Productid { get; set; }
     public Product(int id)
     {
         Productid = id;
     }
 }

定义消息处理程序

这是实际处理上述消息对象的类

 public class ProductHandler : IRequestHandler<Product, string>
 {
     public Task<string> Handle(Product request, CancellationToken cancellationToken)
     {
         return Task.FromResult("Sample Order");
     }
 }

发送消息

现在,最后一步是调用 MediatR 对象的 send 方法。将我们在第一步中定义的的消息对象作为参数传递给此方法。

如你所见,我们没有直接调用 ProductHandler 类,而是调用了 mediator 对象中定义的 send 方法。

现在当你执行你的应用程序时,你将得到以下响应

在这种情况下,这可能不会有太大的区别,因为我们只有一个类。但想象一下,如果我们的应用程序包含数百个类。这将显著减少类之间的耦合。这是因为我们的类将与 mediator 对象通信,而不是直接相互通信。这意味着我们的类现在将依赖于一个 mediator 类,而不是依赖于许多其他类。

历史

  • 2023 年 9 月 21 日:初始版本
© . All rights reserved.