龙空技术网

Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册

My IO 628

前言:

当前姐妹们对“net 开发接口”大约比较关心,各位老铁们都想要知道一些“net 开发接口”的相关文章。那么小编在网上收集了一些对于“net 开发接口””的相关内容,希望同学们能喜欢,你们快快来学习一下吧!

前言

假设我们有三个Service类实现了同一接口,示例代码如下:

public interface IService { }public class ServiceA : IService { }public class ServiceB : IService { } public class ServiceC : IService { }

我们希望在运行时使用依赖注入指定其具体实现类。

在本文中,我们将演示如何使用HTTP请求设置依赖项设置来实现。

Demo

首先,在Startup.cs中做多个实现类注册:

services.AddHttpContextAccessor();services.AddTransient<ServiceA>();services.AddTransient<ServiceB>();services.AddTransient<ServiceC>();services.AddTransient<IService>(serviceProvider =>{    var context = serviceProvider.GetRequiredService<IHttpContextAccessor>();    var containsKey = context.HttpContext?.Request?.Query?.ContainsKey("key");    var key = containsKey.HasValue  && containsKey.Value ? context.HttpContext?.Request?.Query?["key"].First(): "A";    switch (key)    {        case "A":            return serviceProvider.GetService<ServiceA>();        case "B":            return serviceProvider.GetService<ServiceB>();        case "C":            return serviceProvider.GetService<ServiceC>();        default:            throw new KeyNotFoundException();    }});

在这里,我们通过获取HTTP上下文并检查是否定义了key查询字符串参数。

现在,可以向普通方式一样使用IService,示例代码如下:

[ApiController][Route("[controller]")]public class DemoController : ControllerBase{    private readonly IService _service;    public DemoController(IService service)    {        this._service = service;    }    [HttpGet]    public async Task<string> Get()    {        return _service.GetType().Name;    }}

通过从查询字符串中读取值,可以控制具体的IService实现类:

结论

当然,我们不仅可以将此策略用于查询字符串中的值,还可以对标头、Body等HTTP请求包含的任何值使用此策略。

标签: #net 开发接口