Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实现类:
结论
当然,我们不仅可以将此策略用于查询字符串中的值,还可以对标头、Body等HTTP请求包含的任何值使用此策略。
想了解更多内容,请关注我的个人公众号”My IO“
以上是关于Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Web Api Asp.Net Core 实现基于声明的授权?
Asp.Net Core默认注入方式下多接口实现如何注入以及如何指定构造函数注入
Asp.Net Core默认注入方式下多接口实现如何注入以及如何指定构造函数注入