前言

假设我们有三个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请求包含的任何值使用此策略。

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

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

  1. Asp.NET Core 一个接口的多个实现如何通过 DI 注册?

    咨询区 LP13 我有三个 Service 类实现了同一个接口,参考代码如下: public interface IService { } public class ServiceA : IServi ...

  2. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求...

    之所以称ASP.NET Core是一个Web开发平台,而不是一个单纯的开发框架,源于它具有一个极具扩展性的请求处理管道,我们可以通过对这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET ...

  3. 使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

    0. 简要介绍 WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果. PS:Wrk 并不能针对测试的 ...

  4. asp.net core mvc接口,请求响应统一日志管理

    如何为api所有的请求和响应做一个统一的日志记录 1.创建日志类 public class RequestResponseLog {public string Url { get; set; }pub ...

  5. ASP.NET Core MVC/WebAPi如何构建路由?

    前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...

  6. ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

    我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...

  7. ASP.NET Core Authentication and Authorization

    最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1,项目启动的时候直接报错: InvalidOperationException: Endpoint CoreA ...

  8. .NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统

    文章标题:.NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统 作者:Lamond Lu 项目地址:https://github.com/lamondlu/CoolC ...

  9. ASP.NET Core学习资源汇总

    ASP.NET Core入门学习资源汇总篇幅比較長,分为七个部分. (一)认识.NET Core (二)Vistual Studio安装.调试 (三)Asp.Net Core入门指南与学习路线 (四) ...

最新文章

  1. matlab 方波_matlab实现方波与三角波波形
  2. 5G/4G: 3GPP组织及协议版本的发展
  3. 选择“Win32汇编”的三大理由?
  4. 4.7地铁查询开发进度
  5. c语言程序设计华北电力大学,华北电力大学-《C语言程序设计》复习资料.pdf
  6. [蓝桥杯2015决赛]积分之迷-枚举(水题)
  7. JavaScript高级程序设计学习笔记第二十章--JSON
  8. 超火网络直播短视频宣传海报PSD分层模板,新媒体互动
  9. android优雅的一个侧滑
  10. python订阅kafka_程序员基础解答:什么是Kafka?
  11. 报告:代币化资产市值已超200亿美元
  12. Laravel 学习笔记之文件上传
  13. python手机号归属地查询
  14. netty权威指南 微云_Netty权威指南 第2版.pdf
  15. NB-IoT的优势是什么?
  16. 认识COFF文件格式
  17. Java同步问题_Java多线程同步问题
  18. 按键精灵定时后台点击
  19. EXCEL的VLOOKUP与COLUMN函数结合完成工资条实例
  20. 谷粒微博学习笔记一:Utilsconstants

热门文章

  1. Delphi中字符串比较大小 VS Oracle-SQL中字符串比较大小
  2. nagios-3.4.3搭建
  3. 虚拟现实大潮渐近:Oculus VR、EA和Avegant等多家公司...
  4. 关于数据仓库 — 总体工具介绍
  5. [转载]AXIS学习笔记
  6. SiteMapCreator 发布 (Open Source)
  7. P1357 花园 (矩阵快速幂+ DP)
  8. 基于GDAL库,读取海洋风场数据(.nc格式)c++版
  9. 第二百四十六节,Bootstrap弹出框和警告框插件
  10. SpringMVC4零配置--web.xml