asp.net?Core中同名服務(wù)注冊的實(shí)現(xiàn)代碼
通常情況下,在使用注入時(shí)一個(gè)服務(wù)接口對應(yīng)一個(gè)實(shí)現(xiàn)類,注入方式采用構(gòu)造函數(shù)注入即可,但如果存在多個(gè)類實(shí)現(xiàn)同一個(gè)接口的情況下,則需要根據(jù)實(shí)際情況來選擇不同的實(shí)現(xiàn)類。
如以下代碼中的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ù)不同的情況來選擇不同的服務(wù)實(shí)現(xiàn)了。
Asp.Net Core中自帶了容器,同時(shí)也可以使用AutoFac替換掉默認(rèn)的容器,以下為兩種方式同名服務(wù)的注冊實(shí)現(xiàn)。
1、使用.net Core自帶容器
如果采用自帶容器,因?yàn)榇藭r(shí)我們的IEmailService有多個(gè)實(shí)現(xiàn)類,因此需要注入IServiceProvider,然后通過IServiceProvider的GetServices復(fù)數(shù)版本來獲取多個(gè)服務(wù),此時(shí)可以順序調(diào)用多個(gè)實(shí)現(xiàn)服務(wù),如果需要區(qū)別其中的某一個(gè)服務(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))
{
//控制臺(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中的注冊模塊類中進(jìn)行獲取,相關(guān)代碼如下:
public class ConfigureAutofac : Autofac.Module
{
private static IContainer _container;
protected override void Load(ContainerBuilder containerBuilder)
{
//注冊兩個(gè)不同命名的服務(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的模塊配置中實(shí)現(xiàn),也可以在Startup中實(shí)現(xiàn),需要調(diào)用Autofac的GetAutofacRoot方法
/// <summary>
/// ConfigureServices將默認(rèn)的容器注入進(jìn)去,Autofac會(huì)接替默認(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)如果需要在控制器中實(shí)現(xiàn)不同名稱的服務(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<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)文章
解決Visual Studio 2012 Update 4 RC啟動(dòng)調(diào)試失敗的方案
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2012 Update 4 RC啟動(dòng)調(diào)試失敗的解決方案,感興趣的小伙伴們可以參考一下2016-05-05
基于MVC4+EasyUI的Web開發(fā)框架之附件上傳組件uploadify的使用
這篇文章主要介紹了基于MVC4+EasyUI的Web開發(fā)框架之附件上傳組件uploadify的使用,需要的朋友可以參考下2017-08-08
ClickOnce DIY全自動(dòng)更新下載升級(jí)的自我實(shí)現(xiàn)
ClickOnce DIY全自動(dòng)更新下載升級(jí)的自我實(shí)現(xiàn)...2007-08-08
更改.NET中的默認(rèn)時(shí)區(qū)的操作方法
除了"在操作系統(tǒng)中修改時(shí)區(qū)信息,然后重啟.NET應(yīng)用程序,使其生效"之外,如何在不修改操作系統(tǒng)時(shí)區(qū)的前提下,修改.NET中的默認(rèn)時(shí)區(qū)呢,下面小編給大家分享更改.NET中的默認(rèn)時(shí)區(qū)的操作方法,感興趣的朋友一起看看吧2024-06-06
.net使用jwt進(jìn)行身份認(rèn)證的流程記錄
這篇文章主要給大家介紹了關(guān)于.net使用jwt進(jìn)行身份認(rèn)證的相關(guān)資料,JWT是Auth0提出的通過對JSON進(jìn)行加密簽名來實(shí)現(xiàn)授權(quán)驗(yàn)證的方案,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
淺談ASP.NET Core 中jwt授權(quán)認(rèn)證的流程原理
這篇文章主要介紹了淺談ASP.NET Core 中jwt授權(quán)認(rèn)證的流程原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

