C# 中的 Fluent Interface 设计模式

2025年2月5日 | 阅读5分钟

关于流式接口设计模式?

通过在 C# 中使用流式接口设计模式,可以实现面向对象的 API,从而使代码更易于阅读和理解。这种模式经常涉及方法链(method chaining),其中通过将相同的上下文对象返回给每个函数,可以在单行代码中调用多个命令或操作。

使代码更具可读性,并赋予客户端代码类似于领域特定语言的外观,这是流式接口模式的主要目标。流式接口设计模式的主要目标是使用点(.)将多个属性(或操作)附加到对象上。

实施

让我们通过一个例子来更好地理解如何在 C# 中实现流式接口设计模式。

Fluent Interface Design Pattern in C#

假设存在以下员工类。通常,如果我们想使用它,我们会像下面这样创建一个员工类的实例并添加相应的值。

Fluent Interface Design Pattern in C#

我们的对象使用代码通过流式接口得到了简化、提高了可读性和可发现性。创建这类接口相当于说出一种句子,能够简化和提高类使用代码的可读性。

Fluent Interface Design Pattern in C#

在 C# 中,我们有一个名为方法链(Method Chaining)的特性,它有助于我们实现这一点。

C# 中的方法链是什么?

在 C# 中,方法链是一种流行的方法,其中可以组合多个方法来生成一个语句,每个方法都返回一个对象。如下所示,为此,我们必须首先在员工类周围创建一个包装器类。

Fluent Interface Design Pattern in C#

在这里,正如您所见,我们为每个属性都创建了方法。请注意,方法的返回值设置为 Fluentemployee。现在,客户端将使用上述接口之上的流式接口。因此,在上述 Fluentemployee 类到位后,客户端代码应该如下所示。

Fluent Interface Design Pattern in C#

使用 C# 实现流式接口设计模式的示例

让我们通过在 C# 中使用流式接口设计模式来实践我们到目前为止所讨论的一切。需要将以下代码复制并粘贴到首先需要创建的 employee.cs 类文件中。这个类很简单,功能很少。目标是使用方法链来设置这些属性值。

创建包装器

我们将使用这个作为我们的包装器类。在这里,我们为每个员工类字段开发了相应的方法,并使用这些方法来设置员工对象的属性值。

同样重要的是要注意,每个方法(ShowDetails 除外)都返回一个 Fluentemployee 类型。我们可以使用点运算符一个接一个地调用 Fluentemployee 类的方法(ShowDetails 除外),因为这种返回类型(返回 Fluentemployee 实例)允许这样做。

ShowDetails 方法显示值;它不用于设置它们。

在客户端代码中使用包装器

在我们的例子中,客户端将是 Programme 类。因此,使用点(.)运算符——这仅仅是方法链——我们必须从 Client 构建一个 Fluentemployee 类的实例,并依次调用每个方法。因此,对 Programme 类的主函数进行以下更改。

流式接口的优点

  • 可读性:代码由于比自然语言更具表现力和可读性,因此通常更容易理解。
  • 易用性:通过引导用户完成配置过程,提高了 API 的可发现性和准确使用的便捷性。
  • 减少错误:流式接口可以通过准确地引导开发人员完成关键流程来降低错误配置或错误的几率。
  • 灵活性:在不更改外部 API 的情况下,流式接口可以促进底层实现的修改或扩展。
  • 方法链:通过返回上下文对象,可以实现相关对象操作的简洁而逻辑的 agrupació。

何时使用?

C# 流式接口设计模式在以下情况下非常有用:

  • 构建复杂对象:流式接口可以使构建复杂对象的过程更易于理解和掌握,尤其是在涉及多个步骤或选项时。
  • 配置对象:它有助于逐步配置对象,每个方法调用都会调整对象的特定功能,并且方法在逻辑上是相互关联的。
  • 开发领域特定语言 (DSL) API:在设计模仿领域特定语言的代码的 API 时,流式接口是使代码更具表现力和针对特定领域或活动的定制性的绝佳方式。
  • 查询构建:实体框架 (Entity Framework) 等对象关系映射器 (ORM) 通常使用流式接口来构建查询语言,它们允许以类似于自然语言的方式编写数据库查询。
  • 创建不可变对象:它们非常适合创建不可变对象,这些对象的特点是每个方法调用都会创建一个具有修改状态的新对象实例,从而保持不变性。
  • 在代码通过使用方法变得更简洁明了的情况下,会使用方法链。配置设置、构建模式和初始化过程经常使用此方法。
  • 提高可读性和流程:当您希望使代码更具可读性和流畅性时。具有流式接口的代码通常类似于一系列自然语言断言,这更容易阅读、理解和更新。

C# 中流式接口设计模式的实际示例

C# 中流式接口设计模式的实际示例:Automapper

Automapper 是一个在 .Net 应用程序中用于映射对象的库。它以拥有清晰、易读的配置和流式用户界面而闻名。以下是如何以流式方式配置和使用 Automapper 的示例:首先,安装 Automapper 包,可通过 NuGet 获取。

C# 中流式接口设计模式的实际示例:用于 API 请求的 RestSharp

让我们研究一下著名的 RestSharp 库来理解另一个实际示例。它利用流式接口范例,以可读且富有表现力的方式创建和执行 REST 请求。组织库:首先,确保已安装 RestSharp NuGet 包。

结论

总而言之,通过将方法调用链接在一起,C# 中的流式接口设计模式提供了一种简洁而富有表现力的方式来与设备通信。通过从每个方法返回当前对象实例(this),开发人员可以轻松地链接多个方法调用,从而提高代码的可读性和直观性。

当需要设置或配置对象的多个属性时,此模式非常有用。它通过以一种更易于阅读且更像自然语言句子的方式来组织代码来实现这一点。但是,谨慎使用流式接口方法至关重要。过度使用可能导致代码难以阅读和过于复杂。