asp.net Core中同名服务注册的实现代码

目录
  • 1、使用.net Core自带容器
  • 2、AutoFac中的实现

通常情况下,在使用注入时一个服务接口对应一个实现类,注入方式采用构造函数注入即可,但如果存在多个类实现同一个接口的情况下,则需要根据实际情况来选择不同的实现类。

如以下代码中的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();
		}

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

到此这篇关于asp.net Core中的同名服务注册的文章就介绍到这了,更多相关asp.net Core服务注册内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core依赖注入系列教程之服务的注册与提供

    前言 在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core中的DI容器体现为一个实现了IServiceProvider接口的对象. ServiceProvider与ServiceDescriptor 服务的注册与提供     利用ServiceProvider来提供服务     提供一个服务实例的集合     获取ServiceProvider自身对

  • ASP.Net Core MVC基础系列之服务注册和管道

    想必大家都知道ASP.Net Core MVC默认自带了DI容器的, 我们可以很方便的进行使用, 来方便管理对象和生命周期, 那么这一节我就会详细讲解服务注册, 顺便简单讲解一下管道, 让大家知道了基本的MVC运行流程. 回顾一下上一节的内容, 我们从配置文件中获取了输出的字符, 也介绍各个配置的 "优先级" (其实是配置覆盖), 那么我们这一节以服务的方式输出这个字符串, 然后用过DI进行注册服务, 快速了解服务注册. DI容器呢, 依赖接口, 所以我们先新建一个接口, 就叫 IWe

  • asp.net Core中同名服务注册的实现代码

    目录 1.使用.net Core自带容器 2.AutoFac中的实现 通常情况下,在使用注入时一个服务接口对应一个实现类,注入方式采用构造函数注入即可,但如果存在多个类实现同一个接口的情况下,则需要根据实际情况来选择不同的实现类. 如以下代码中的MyEmailService和EmailService都实现了IEmailService接口: public class MyEmailService : IEmailService { public string Send(string Email)

  • 如何在ASP.NET Core中给上传图片功能添加水印实例代码

    前言 因某些原因需要在图片上添加文字水印.图片水印,所以这里做个简单的记录.下面话不多说了,来一起看看详细的实现过程吧 实现方法: 在传统的.NET框架中,我们给图片添加水印有的是通过HttpModules或者是HttpHandler,然后可以通过以下代码添加水印: var image = new WebImage(imageBytes); image.AddTextWatermark( Settings.Instance.WatermarkText, "White", Setting

  • Asp.Net Core中服务的生命周期选项区别与用法详解

    前言 最近在做一个小的Demo中,在一个界面上两次调用视图组件,并且在视图组件中都调用了数据库查询,结果发现,一直报错,将两个视图组件的调用分离,单独进行,却又是正常的,寻找一番,发现是配置依赖注入服务时,对于服务的生命周期没有配置得当导致,特此做一次实验来认识三者之间(甚至是四者之间的用法及区别). 本文demo地址(具体见WebApi控制器中):https://gitee.com/530521314/koInstance.git (本地下载)  一.服务的生命周期 在Asp.Net Core

  • 使用VS2022在ASP.NET Core中构建轻量级服务

    目录 1. 使用 VS2022 创建 ASP.NET Core 项目 2. 在 ASP.NET Core 中启用一个轻量级的服务 3. 在 ASP.NET Core 中使用 IEndpointConventionBuilder 扩展方法 4. 在 ASP.NET Core 中使用轻量级服务检索记录 5. 在 ASP.NET Core 中使用轻量级服务创建记录 6. 在 ASP.NET Core 中使用轻量级服务删除记录 7. ASP.NET Core 中轻量级服务的配置方法 8. 在 ASP.N

  • 在 ASP.NET Core 中为 gRPC 服务添加全局异常处理

    目录 一.咨询区 Dmitriy 二.回答区 valentasm 三.点评区 以下文章来源于公众号:DotNetCore实战 一.咨询区 Dmitriy 在 ASP.NET Core 中使用GRPC.ASPNETCore 工具包写 gRPC 服务,想实现 gRPC 的异常全局拦截, 代码如下: app.UseExceptionHandler(configure => {     configure.Run(async e =>     {         Console.WriteLine(&

  • ASP.NET Core中引用OpenAPI服务添加示例

    目录 文章目录 前言:一.将 Swagger 引入 WebAPI 项目二.添加 OpenAPI 服务引用参考文档 前言: 本文使用 .NET Core SDK 3.1 的版本.在我们使用微服务的时候,各个微服务之间会经常调用接口,但是手动写Http请求的代码非常繁琐,在 Visual Studio 2019 的 .NET Core 项目中提供了添加连接的服务的功能,使得我们的工作变得简单容易. 一.将 Swagger 引入 WebAPI 项目 将 Swagger 引入 ASP.NET Core

  • ASP.NET Core中Startup类、Configure()方法及中间件详解

    ASP.NET Core 程序启动过程如下 1, Startup 类 ASP.NET Core 应用使用Startup类,按照约定命名为Startup.Startup类: 可选择性地包括ConfigureServices方法以配置应用的服务. 必须包括Configure方法以创建应用的请求处理管道. 当应用启动时,运行时调用ConfigureServices和Configure . Startup 方法体如下 public class Startup { // 使用此方法向容器添加服务 publ

  • 详解在ASP.NET Core 中使用Cookie中间件

    在 http:// ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分配到HttpContext对象的User属性中.如果你想提供自己的登录方式和用户数据你可以使用Cookie中间件来实现独立的功能. 添加和配置 第一步是增加Cookie中间件到你的应用中.首先使用nuget增加Microsoft.AspNetCore.Authentication.

  • 在ASP.NET Core 中发送邮件的实现方法(必看篇)

    前言 我们知道目前 .NET Core 还不支持 SMTP 协议,当我么在使用到发送邮件功能的时候,需要借助于一些第三方组件来达到目的,今天给大家介绍两款开源的邮件发送组件,它们分别是 MailKit 和 FluentEmail , 下面我对它们分别进行介绍. MailKit 在 ASP.NET Core 中,可以使用 MailKit 来发送邮件,它支持跨平台,并且支持 IMAP, POP3, SMTP 等协议. 你可以使用下面的方式安装: Install-Package MailKit 下面是

  • Asp.net Core中如何使用中间件来管理websocket

    介绍 我喜欢.NET CORE 这个东西,其实不仅仅源于它性能很高,可以跨平台,还因为它的设计模式确实令人着迷.以前没.NET CORE 的时候,.NET用websocket必须跑在windows server 2012上,但我一般不会这么干,都把websocket架在nodejs的服务器上.这么分出来,麻烦肯定是麻烦的,而且js这东西,写复杂和几年后再看都是头疼的问题.那么,如果.NET CORE是以kestrel运行的,那么就不再需要考虑服务器的版本运行,任何一个地方都可以用websocke

随机推荐