日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(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 IEnumerable emailService;
			private readonly ILogger logger;
			/// 
			/// 注入IServiceProvider獲取服務(wù)
			/// 
			/// 
			/// 
			public ValuesController(IServiceProvider serviceProvider, ILogger logger)
			{
				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 ILogger logger;
			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

欄目分類(lèi)
最近更新