首页 >后端开发 >C++ >如何在ASP.NET核心依赖注入中使用唯一的键注册和解析多个接口实现?

如何在ASP.NET核心依赖注入中使用唯一的键注册和解析多个接口实现?

Susan Sarandon
Susan Sarandon原创
2025-01-29 21:31:09407浏览

How Can I Register and Resolve Multiple Interface Implementations with Unique Keys in ASP.NET Core Dependency Injection?

在ASP.NET Core中注册和解析多个接口实现

问题陈述

在使用实现相同接口的服务时,基于唯一键注册和解析它们可能是一个挑战。与允许使用键来区分具体实现的其他IoC容器不同,ASP.NET Core的默认DI系统在这方面似乎受到限制。

解决方案:使用Func委托

为了克服这个限制,可以通过使用ServiceResolver类型的共享委托作为一种变通方案来实现,该委托将键作为参数并返回所需服务的实例。

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

Startup.cs文件中,使用ServiceResolver注册瞬态服务和类型的映射:

<code class="language-csharp">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();
    }
});</code>

在任何使用DI注入的类中,都可以使用ServiceResolver来获取所需的Service:

<code class="language-csharp">public class Consumer
{
    private readonly IService _aService;

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

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

注意:此方法出于简化目的使用字符串键,但如果需要,可以使用任何自定义解析类型作为键。

其他注意事项

虽然此解决方案解决了基于键注册和解析多个接口实现的问题,但需要注意以下几点:

  • 此解决方案涉及手动映射,如果维护不当,可能会容易出错。
  • 它没有解决在注册期间将静态数据注入构造函数的问题。为此,请考虑使用选项模式或其他技术。

以上是如何在ASP.NET核心依赖注入中使用唯一的键注册和解析多个接口实现?的详细内容。更多信息请关注PHP中文网其他相关文章!

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