欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

asp.net?Core中同名服務(wù)注冊的實現(xiàn)代碼

 更新時間:2022年03月20日 09:29:23   作者:靜以修身儉以養(yǎng)德  
Asp.Net?Core中自帶了容器,同時也可以使用AutoFac替換掉默認(rèn)的容器,以下為兩種方式同名服務(wù)的注冊實現(xiàn),對asp.net?Core服務(wù)注冊的實現(xiàn)代碼感興趣的朋友一起看看吧

通常情況下,在使用注入時一個服務(wù)接口對應(yīng)一個實現(xiàn)類,注入方式采用構(gòu)造函數(shù)注入即可,但如果存在多個類實現(xiàn)同一個接口的情況下,則需要根據(jù)實際情況來選擇不同的實現(xiàn)類。

如以下代碼中的MyEmailService和EmailService都實現(xiàn)了IEmailService接口:

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

		public class EmailService : IEmailService
				return Email;

在這種情況,就需要根據(jù)不同的情況來選擇不同的服務(wù)實現(xiàn)了。

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

1、使用.net Core自帶容器

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

[Route("api/[controller]")]
		[ApiController]
		public class ValuesController : ControllerBase
		{
			private readonly IEnumerable<IEmailService> emailService;
			private readonly ILogger<ValuesController> logger;
			/// <summary>
			/// 注入IServiceProvider獲取服務(wù)
			/// </summary>
			/// <param name="serviceProvider"></param>
			/// <param name="logger"></param>
			public ValuesController(IServiceProvider serviceProvider, ILogger<ValuesController> logger)
			{
				var service = serviceProvider.GetServices<IEmailService>(); //獲取服務(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))
					{ 
						//控制臺輸出調(diào)用日志
						logger.LogInformation(emailService.Send(email));
					}
				}
				return Ok();
		}

2、AutoFac中的實現(xiàn)

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

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

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

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

/// <summary>
			/// ConfigureServices將默認(rèn)的容器注入進去,Autofac會接替默認(rèn)的,然后執(zhí)行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)如果需要在控制器中實現(xiàn)不同名稱的服務(wù)調(diào)用,則需要在控制器中注入IApplicationBuilder接口,但直接注入會報未解析服務(wù)的錯誤,需要手動在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();
		}

參考:https://blog.csdn.net/hahahzzzzz/article/details/118684998

到此這篇關(guān)于asp.net Core中的同名服務(wù)注冊的文章就介紹到這了,更多相關(guān)asp.net Core服務(wù)注冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ASP.NET中的參數(shù)與特殊類型和特性

    ASP.NET中的參數(shù)與特殊類型和特性

    這篇文章主要介紹了ASP.NET中的參數(shù)與特殊類型和特性,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • ASP.Net中利用CSS實現(xiàn)多界面的兩種方法

    ASP.Net中利用CSS實現(xiàn)多界面的兩種方法

    這篇文章主要介紹了ASP.Net中利用CSS實現(xiàn)多界面的兩種方法,包括動態(tài)加載css樣式與動態(tài)設(shè)置頁面同類控件的方法來實現(xiàn)該功能,是非常具有實用價值的技巧,需要的朋友可以參考下
    2014-12-12
  • ASP.Net頁面間變量值傳遞的方法

    ASP.Net頁面間變量值傳遞的方法

    頁面?zhèn)髦凳菍W(xué)習(xí)asp.net初期都會面臨的一個問題,這篇文章主要介紹了ASP.Net頁面間變量值傳遞的方法,詳細的介紹了幾種方法,非常具有實用價值,需要的朋友可以參考下
    2018-11-11
  • asp.net中Datalist使用數(shù)字分頁的實現(xiàn)方法

    asp.net中Datalist使用數(shù)字分頁的實現(xiàn)方法

    asp.net下Datalist使用數(shù)字分頁的實現(xiàn)代碼,需要的朋友可以參考下。
    2010-10-10
  • ASP.NET Core3.1 Ocelot認(rèn)證的實現(xiàn)

    ASP.NET Core3.1 Ocelot認(rèn)證的實現(xiàn)

    這篇文章主要介紹了ASP.NET Core3.1 Ocelot認(rèn)證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • ASP.NET預(yù)定義模板介紹

    ASP.NET預(yù)定義模板介紹

    在調(diào)用這些方法的時候,如果我們指定了一個具體的通過分部View定義的模板,或者對應(yīng)的ModelMetadata的TemplateHint屬性具有一個模板名稱,會自動采用該模板來生成最終的HTML,需要了解這方面內(nèi)容的朋友可以參考一下
    2015-10-10
  • iframe跨域與session失效問題的解決辦法

    iframe跨域與session失效問題的解決辦法

    這篇文章主要介紹了iframe跨域與session失效問題的解決辦法,有需要的朋友可以參考一下
    2014-01-01
  • asp.net解決上傳4M文件限制

    asp.net解決上傳4M文件限制

    只需要在服務(wù)器上修改如下文件就可以使asp.net突破上傳4M文件的限制,大家參考使用吧
    2014-01-01
  • ASP.NET?MVC使用Quartz.NET執(zhí)行定時任務(wù)

    ASP.NET?MVC使用Quartz.NET執(zhí)行定時任務(wù)

    這篇文章介紹了ASP.NET?MVC使用Quartz.NET執(zhí)行定時任務(wù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 在.NET中利用XMLHTTP下載文件的代碼

    在.NET中利用XMLHTTP下載文件的代碼

    在.NET中利用XMLHTTP下載文件的代碼...
    2007-03-03

最新評論