網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
asp.net?Core中同名服務(wù)注冊(cè)的實(shí)現(xiàn)代碼_實(shí)用技巧
作者:靜以修身儉以養(yǎng)德 ? 更新時(shí)間: 2022-05-22 編程語(yǔ)言通常情況下,在使用注入時(shí)一個(gè)服務(wù)接口對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),注入方式采用構(gòu)造函數(shù)注入即可,但如果存在多個(gè)類(lèi)實(shí)現(xiàn)同一個(gè)接口的情況下,則需要根據(jù)實(shí)際情況來(lái)選擇不同的實(shí)現(xiàn)類(lèi)。
如以下代碼中的MyEmailService和EmailService都實(shí)現(xiàn)了IEmailService接口:
public class MyEmailService : IEmailService { public string Send(string Email) { return "My" + Email; } } public class EmailService : IEmailService return Email;
在這種情況,就需要根據(jù)不同的情況來(lái)選擇不同的服務(wù)實(shí)現(xiàn)了。
Asp.Net Core中自帶了容器,同時(shí)也可以使用AutoFac替換掉默認(rèn)的容器,以下為兩種方式同名服務(wù)的注冊(cè)實(shí)現(xiàn)。
1、使用.net Core自帶容器
如果采用自帶容器,因?yàn)榇藭r(shí)我們的IEmailService有多個(gè)實(shí)現(xiàn)類(lèi),因此需要注入IServiceProvider,然后通過(guò)IServiceProvider的GetServices復(fù)數(shù)版本來(lái)獲取多個(gè)服務(wù),此時(shí)可以順序調(diào)用多個(gè)實(shí)現(xiàn)服務(wù),如果需要區(qū)別其中的某一個(gè)服務(wù),可以通過(guò)type加以區(qū)分。
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly IEnumerableemailService; private readonly ILogger logger; /// /// 注入IServiceProvider獲取服務(wù) /// /// /// public ValuesController(IServiceProvider serviceProvider, ILoggerlogger) { var service = serviceProvider.GetServices (); //獲取服務(wù) this.emailService = service; this.logger = logger; } [HttpGet] public IActionResult Send(string email) //可以遍歷服務(wù) foreach (var emailService in emailService) { if(emailService.GetType() == typeof(First_EmailService)) { //控制臺(tái)輸出調(diào)用日志 logger.LogInformation(emailService.Send(email)); } } return Ok(); }
2、AutoFac中的實(shí)現(xiàn)
如果需要在Autofac中解析不同的服務(wù),需要用到Named實(shí)現(xiàn)。首先,需要獲取Autofac的容器,即IContainer實(shí)例。獲取的位置有兩種:
(1)在ConfigureContainer中的注冊(cè)模塊類(lèi)中進(jìn)行獲取,相關(guān)代碼如下:
public class ConfigureAutofac : Autofac.Module { private static IContainer _container; protected override void Load(ContainerBuilder containerBuilder) { //注冊(cè)兩個(gè)不同命名的服務(wù) containerBuilder.RegisterType().Named ("one"); containerBuilder.RegisterType ().Named ("two"); //需要在回調(diào)用獲取容器 containerBuilder.RegisterBuildCallback(container => { _container = (IContainer)container; var one = _container.ResolveNamed ("two"); one.Send("one"); }); } }
(2)上述服務(wù)是Autofac的模塊配置中實(shí)現(xiàn),也可以在Startup中實(shí)現(xiàn),需要調(diào)用Autofac的GetAutofacRoot方法
////// ConfigureServices將默認(rèn)的容器注入進(jìn)去,Autofac會(huì)接替默認(rèn)的,然后執(zhí)行ConfigureContainer /// /// public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType().As (); } //注冊(cè)根容器 public ILifetimeScope AutofacContainer { get; private set; } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) this.AutofacContainer = app.ApplicationServices.GetAutofacRoot(); var serviceName = this.AutofacContainer.Resolve (); serviceName.ShowCode(); //...
(3)如果需要在控制器中實(shí)現(xiàn)不同名稱(chēng)的服務(wù)調(diào)用,則需要在控制器中注入IApplicationBuilder接口,但直接注入會(huì)報(bào)未解析服務(wù)的錯(cuò)誤,需要手動(dòng)在ConfigureServices中配置一下
services.AddSingleton<IApplicationBuilder, ApplicationBuilder>();
之后就可以在控制器中正常注入了
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly IApplicationBuilder app; private readonly ILoggerlogger; public ILifetimeScope AutofacContainer { get; private set; } public ValuesController(IApplicationBuilder app, ILogger logger) { this.app = app; this.logger = logger; } [HttpGet] public IActionResult Send(string email) this.AutofacContainer = app.ApplicationServices.GetAutofacRoot(); var serviceName = this.AutofacContainer.ResolveNamed ("one"); logger.LogInformation(serviceName.Send(string.Empty)); return Ok(); }
參考:https://blog.csdn.net/hahahzzzzz/article/details/118684998
原文鏈接:https://www.cnblogs.com/superfeeling/archive/2022/03/19/16027474.html
相關(guān)推薦
- 2022-12-06 Python中八種數(shù)據(jù)導(dǎo)入方法總結(jié)_python
- 2022-02-03 ionic錨點(diǎn)操作
- 2022-09-21 Mac安裝軟件時(shí)提示已損壞的完美解決方法_相關(guān)技巧
- 2022-12-13 Python?urllib?入門(mén)使用詳細(xì)教程_python
- 2022-05-31 k8s部署Ingress并創(chuàng)建規(guī)則的詳細(xì)介紹_云其它
- 2022-05-21 Python中三種花式打印的示例詳解_python
- 2022-07-28 C++超詳細(xì)講解函數(shù)參數(shù)的默認(rèn)值_C 語(yǔ)言
- 2022-07-08 Python數(shù)據(jù)分析Pandas?Dataframe排序操作_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支