溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

asp.net?Core中如何實現同名服務注冊

發布時間:2022-03-21 09:16:25 來源:億速云 閱讀:219 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“asp.net Core中如何實現同名服務注冊”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“asp.net Core中如何實現同名服務注冊”這篇文章吧。

通常情況下,在使用注入時一個服務接口對應一個實現類,注入方式采用構造函數注入即可,但如果存在多個類實現同一個接口的情況下,則需要根據實際情況來選擇不同的實現類。

如以下代碼中的MyEmailService和EmailService都實現了IEmailService接口:

public class MyEmailService : IEmailService
		{
			public string Send(string Email)
			{
				return "My" + Email;
			}
		}

		public class EmailService : IEmailService
				return Email;

在這種情況,就需要根據不同的情況來選擇不同的服務實現了。

Asp.Net Core中自帶了容器,同時也可以使用AutoFac替換掉默認的容器,以下為兩種方式同名服務的注冊實現。

1、使用.net Core自帶容器

如果采用自帶容器,因為此時我們的IEmailService有多個實現類,因此需要注入IServiceProvider,然后通過IServiceProvider的GetServices復數版本來獲取多個服務,此時可以順序調用多個實現服務,如果需要區別其中的某一個服務,可以通過type加以區分。

[Route("api/[controller]")]
		[ApiController]
		public class ValuesController : ControllerBase
		{
			private readonly IEnumerable<IEmailService> emailService;
			private readonly ILogger<ValuesController> logger;
			/// <summary>
			/// 注入IServiceProvider獲取服務
			/// </summary>
			/// <param name="serviceProvider"></param>
			/// <param name="logger"></param>
			public ValuesController(IServiceProvider serviceProvider, ILogger<ValuesController> logger)
			{
				var service = serviceProvider.GetServices<IEmailService>(); //獲取服務
				this.emailService = service;
				this.logger = logger;
			}
			[HttpGet]
			public IActionResult Send(string email)
				//可以遍歷服務
				foreach (var emailService in emailService)
				{
					if(emailService.GetType() == typeof(First_EmailService))
					{ 
						//控制臺輸出調用日志
						logger.LogInformation(emailService.Send(email));
					}
				}
				return Ok();
		}

2、AutoFac中的實現

如果需要在Autofac中解析不同的服務,需要用到Named實現。首先,需要獲取Autofac的容器,即IContainer實例。獲取的位置有兩種:

(1)在ConfigureContainer中的注冊模塊類中進行獲取,相關代碼如下:

public class ConfigureAutofac : Autofac.Module
		{
			private static IContainer _container;
			protected override void Load(ContainerBuilder containerBuilder)
			{
				//注冊兩個不同命名的服務
				containerBuilder.RegisterType<EmailService>().Named<IEmailService>("one");
				containerBuilder.RegisterType<MyEmailService>().Named<IEmailService>("two");
				//需要在回調用獲取容器
				containerBuilder.RegisterBuildCallback(container =>
				{
					_container = (IContainer)container;
					var one =  _container.ResolveNamed<IEmailService>("two");
					one.Send("one");
				});
			}
		}

(2)上述服務是Autofac的模塊配置中實現,也可以在Startup中實現,需要調用Autofac的GetAutofacRoot方法

/// <summary>
			/// ConfigureServices將默認的容器注入進去,Autofac會接替默認的,然后執行ConfigureContainer
			/// </summary>
			/// <param name="builder"></param>
			public void ConfigureContainer(ContainerBuilder builder)
			{
				builder.RegisterType<MyService>().As<IMyService>();
			}
	 
			//注冊根容器
			public ILifetimeScope AutofacContainer { get; private set; }
			public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
				this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
				var serviceName = this.AutofacContainer.Resolve<IMyService>();
				serviceName.ShowCode();
				//...

(3)如果需要在控制器中實現不同名稱的服務調用,則需要在控制器中注入IApplicationBuilder接口,但直接注入會報未解析服務的錯誤,需要手動在ConfigureServices中配置一下

services.AddSingleton&lt;IApplicationBuilder, ApplicationBuilder&gt;();

之后就可以在控制器中正常注入了

[Route("api/[controller]")]
		[ApiController]
		public class ValuesController : ControllerBase
		{
			private readonly IApplicationBuilder app;
			private readonly ILogger<ValuesController> logger;
			public ILifetimeScope AutofacContainer { get; private set; }
			public ValuesController(IApplicationBuilder app, ILogger<ValuesController> logger)
			{
				this.app = app;
				this.logger = logger;
			}
			[HttpGet]
			public IActionResult Send(string email)
				this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
				var serviceName = this.AutofacContainer.ResolveNamed<IEmailService>("one");
				logger.LogInformation(serviceName.Send(string.Empty));
				return Ok();
		}

以上是“asp.net Core中如何實現同名服務注冊”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女