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

前言

假设我们有三个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实现类:

6ed1f48f4dc92af5bda174386e79d398.png

04e501f568308a34b31969ea37dc0fd5.png

结论

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

想了解更多内容,请关注我的个人公众号”My IO“

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值