Asp.NET Core 一个接口的多个实现如何通过 DI 注册?
生活随笔
收集整理的這篇文章主要介紹了
Asp.NET Core 一个接口的多个实现如何通过 DI 注册?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
LP13
我有三個 Service 類實現了同一個接口,參考代碼如下:
public?interface?IService?{?} public?class?ServiceA?:?IService?{?} public?class?ServiceB?:?IService?{?}? public?class?ServiceC?:?IService?{?}我知道像其他的 DI 容器,比如 Unity 是在注冊實現類的時候通過不同的key來區分,在 ASP.NET Core 中做 AddService 時并沒有看到 key 或 name 參數的重載方法。
public?void?ConfigureServices(IServiceCollection?services){????????????//?How?do?I?register?services?of?the?same?interface?????????????}public?MyController:Controller{public?void?DoSomething(string?key){?//?How?do?I?resolve?the?service?by?key?}}請問我該如何實現呢?
回答區
Miguel A. Arilla
我也遇到了這種場景,不過我是用 Func 做了一個折中方案。
首先:定義一個 委托。
public?delegate?IService?ServiceResolver(string?key);然后:在 Startup.cs 中做多個實現類注冊。
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();?//?or?maybe?return?null,?up?to?you} });后期:如果想使用的話,通過 key 從 Func 中提取具體的實例,參考代碼如下:
public?class?Consumer {private?readonly?IService?_aService;public?Consumer(ServiceResolver?serviceAccessor){_aService?=?serviceAccessor("A");}public?void?UseServiceA(){_aService.DoTheThing();} }為了做演示目的,我這里只用了 string 作為解析,你可以根據自己的場景具體實現。
點評區
在 Asp.Net Core 中是不支持這種多注冊的,這就有點尷尬了,Miguel A. Arilla 大佬提供的方案不錯,學習了。
總結
以上是生活随笔為你收集整理的Asp.NET Core 一个接口的多个实现如何通过 DI 注册?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年终结版WPF项目实战合集发布
- 下一篇: 初探IdentityServer4(客户