首页 >后端开发 >C++ >如何使用ASP.NET Core中的自定义键解析多个服务实现?

如何使用ASP.NET Core中的自定义键解析多个服务实现?

Patricia Arquette
Patricia Arquette原创
2025-01-29 21:16:11625浏览

How to Resolve Multiple Service Implementations with Custom Keys in ASP.NET Core?

在 ASP.NET Core 中使用自定义键解析多个服务实现

在 ASP.NET Core 中注册同一接口的多个具体实现时,您可能会遇到定义唯一键来区分它们的限制。但是,可以使用委托在运行时解析合适的实现来解决此问题。

为此,请按照以下步骤操作:

  1. 定义共享委托:

    • 创建一个名为 ServiceResolver 的委托,它接受一个键并返回一个 IService 实例。
  2. 注册具体实现和映射键:

    • 使用 AddTransientStartup.cs 文件中注册每个具体实现。
    • 添加一个 ServiceResolver 瞬态注册。在此注册中,使用 switch 语句使用 GetService 将键映射到相应的具体实现。
  3. 使用 ServiceResolver:

    • 在通过 DI 注册的类中,使用 ServiceResolver 获取所需的实现。将适当的键作为参数传递给解析器。

示例:

<code class="language-csharp">public delegate IService ServiceResolver(string key);

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ServiceA>();
    services.AddTransient<ServiceB>();
    services.AddTransient<ServiceC>();

    services.AddTransient<ServiceResolver>(serviceProvider => key =>
    {
        switch (key)
        {
            case "A":
                return serviceProvider.GetService<ServiceA>();
            case "B":
                return serviceProvider.GetService<ServiceB>();
            case "C":
                return serviceProvider.GetService<ServiceC>();
            default:
                throw new KeyNotFoundException();
        }
    });
}

public class Consumer
{
    private readonly IService _aService;

    public Consumer(ServiceResolver serviceAccessor)
    {
        _aService = serviceAccessor("A");
    }

    public void UseServiceA()
    {
        _aService.DoTheThing();
    }
}</code>

注意: 此解决方案不会解决在注册期间将数据注入构造函数的问题。为此,请考虑探索其他机制,例如 IOption 或自定义容器实现。

This revised response maintains the image and its original format while rewording the text for improved clarity and flow. The code example remains unchanged as it's already well-formatted.

以上是如何使用ASP.NET Core中的自定义键解析多个服务实现?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn