在 .NET 8 中使用键控服务实现策略设计模式

作者:微信公众号:【架构师老卢】
3-24 18:41
35

概述:介绍策略设计模式是软件开发中常用的模式,它使我们能够定义一组算法并封装每个算法。接口和抽象类可以创建一组相关算法,客户端可以在运行时从中进行选择。这种方法鼓励使用允许灵活选择适当实现的模式。本文阐明了如何使用依赖项注入和内置服务提供程序在 .NET 8 中实现具有键控服务的战略设计模式。这种方法增强了软件系统的灵活性和可维护性,并改进了与其他服务和组件的集成。策略设计模式概述在进入实现细节之前,让我们简要概述一下战略设计模式的核心概念。**上下文:**上下文通过提供的方法指定和执行策略。(例如,ExecuteStrategy)。策略:该策略是所有具体策略的契约,通常是一个接口或具有封装算法方法

介绍

策略设计模式是软件开发中常用的模式,它使我们能够定义一组算法并封装每个算法。接口和抽象类可以创建一组相关算法,客户端可以在运行时从中进行选择。这种方法鼓励使用允许灵活选择适当实现的模式。本文阐明了如何使用依赖项注入和内置服务提供程序在 .NET 8 中实现具有键控服务的战略设计模式。这种方法增强了软件系统的灵活性和可维护性,并改进了与其他服务和组件的集成。

策略设计模式概述

在进入实现细节之前,让我们简要概述一下战略设计模式的核心概念。

  1. **上下文:**上下文通过提供的方法指定和执行策略。(例如,ExecuteStrategy)。
  2. 策略:该策略是所有具体策略的契约,通常是一个接口或具有封装算法方法(例如,Execute)的抽象类。

此代码示例中实现了策略设计模式,通过考虑用户定义的键来执行算术运算。这些键可能包括加法和减法。

键控服务概述

在 .NET 8 中使用依赖关系注入实现策略设计模式时,了解键控服务至关重要。我们可以利用密钥服务动态管理依赖关系并根据特定的键或标识符解析服务。这增强了在运行时选择和注入不同实现的灵活性。因此,让我们深入研究这种方法的主要组成部分:

  1. 密钥服务注册: 在 .NET 8 中,使用特定键(如枚举或字符串)在依赖项注入容器中注册服务,以唯一标识每个服务实现。此方法允许同一接口的多个实现在容器中共存,每个实现都具有不同的键。
  2. 按密钥解析服务:在运行时,可以使用服务实现的密钥从依赖项注入容器中检索服务实现。当根据应用程序状态、用户输入或配置动态选择服务实现时,此方法非常有用。
  3. 与策略模式的集成: 将键控服务与策略设计模式相结合,可以将每个具体策略注册为键控服务。通过集成这种方法,上下文可以根据给定的键动态选择适当的策略实现。这提高了应用程序的灵活性和可维护性,因为可以修改或添加策略,而无需更改客户端代码。

策略设计模式与键控服务结合使用时,可以为 .NET 8 应用程序提供高度的灵活性和动态行为。此方法遵循策略设计模式的原则,同时利用 .NET 8 提供的可靠的依赖关系注入框架。通过在运行时选择和执行各种算法,应用程序可以实现高度的适应性。该应用程序的架构有助于实现这种方法,从而为企业和学术界带来重大利益。

实施细节

收购: 通过实施这种方法,我们将拥有一个动态运行输入、输出和策略的上下文。这意味着,通过使用这个上下文,如果我们愿意,我们可以拥有具有不同输入和输出的几种策略模式。

我已经定义了在 .NET 8 中使用键控服务实现策略设计模式所需的接口和类。

public interface IContext
{
    Task<TOut> ExecuteStrategy<TIn, TOut, TStrategy>(string key, TIn model, CancellationToken cancellationToken)
        where TStrategy : IStrategy<TIn, TOut>;
}
public class Context(IServiceProvider serviceProvider) : IContext
{
    public async Task<TOut> ExecuteStrategy<TIn, TOut, TStrategy>(string key, TIn model, CancellationToken cancellationToken)
        where TStrategy : IStrategy<TIn, TOut>
    {
        ArgumentException.ThrowIfNullOrWhiteSpace(key);
        ArgumentNullException.ThrowIfNull(model);

        var strategy = serviceProvider.GetKeyedService<TStrategy>(key);

        StrategyNotFoundException.ThrowIfNull(strategy);

        return await strategy!.Execute(model, cancellationToken);
    }
}
public interface IStrategy<in TIn, TOut>
{
    public Task<TOut> Execute(TIn input, CancellationToken cancellationToken);
}

在上面的代码片段中,我定义了“IContext”接口,其中包含一个名为“ExecuteStrategy”的方法,用于执行策略。“Context”类实现此接口,并利用 .NET Core“IServiceProvider”根据提供的密钥检索相应的策略。

接下来,我定义了一个简单的“ContextModel”类来表示数学运算的输入数据,并创建了两个具体的策略,“SumStrategy”和“SubtractStrategy”,它们实现了“IMathStrategy”接口。

public class ContextModel
{
    public int FirstNumber { get; set; }
    public int SecondNumber { get; set; }
}
public interface IMathStrategy : IStrategy<ContextModel, int>
{
}
public class SumStrategy : IMathStrategy
{
    public Task<int> Execute(ContextModel input, CancellationToken cancellationToken)
    {
        var response = input.FirstNumber + input.SecondNumber;
        return Task.FromResult(response);
    }
}
public class SubtractStrategy : IMathStrategy
{
    public Task<int> Execute(ContextModel input, CancellationToken cancellationToken)
    {
        var response = input.FirstNumber - input.SecondNumber;
        return Task.FromResult(response);
    }
}

依赖注入配置

我们应该在 Program.cs 类中配置服务以利用依赖注入和密钥服务。

builder.Services.AddScoped<IContext, Context>();

builder.Services.AddKeyedScoped<IMathStrategy, SumStrategy>(nameof(SumStrategy));
builder.Services.AddKeyedScoped<IMathStrategy, SubtractStrategy>(nameof(SubtractStrategy));

在Program.cs中,我使用“**Context”**类实现注册“IContext”接口。此外,我利用“**AddKeyedScoped”**方法将“**IMathStrategy”**接口注册到“**SumStrategy”**和“**SubtractStrategy”**实现,并将它们与唯一键相关联。

使用示例

现在我已经设置了服务并定义了我的策略,让我们探讨如何利用“**IContext”**接口来实现这些策略。

var response = await _context.ExecuteStrategy<ContextModel, int, IMathStrategy>("SumStrategy", new ContextModel()
{
    FirstNumber = 6,
    SecondNumber = 2
}, CancellationToken cancellationToken);

在此用法示例中,我在“IContext”(通过依赖注入检索)的实例上调用“**ExecuteStrategy”**方法,指定键“SumStrategy”以对提供的“**ContextModel”**数据执行加法操作。

结论

在本文中,我们探讨了如何在 .NET 8 中使用键控服务实现策略设计模式。通过利用依赖项注入和 .NET Core 服务提供程序,我们创建了一个基于用户定义键执行策略的上下文。在运行时选择和交换不同算法的能力提供了显着的适应性和可扩展性,使其成为开发灵活且易于维护的软件系统的有效工具。

相关留言评论
昵称:
邮箱:
阅读排行