广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >asp.net Core中同名服务注册的实现代码
  • 134
分享到

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

2024-04-02 19:04:59 134人浏览 安东尼
摘要

目录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服务注册内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: asp.net Core中同名服务注册的实现代码

本文链接: https://www.lsjlt.com/news/143133.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • asp.net Core中同名服务注册的实现代码
    目录1、使用.net Core自带容器2、AutoFac中的实现通常情况下,在使用注入时一个服务接口对应一个实现类,注入方式采用构造函数注入即可,但如果存在多个类实现同一个接口的情况...
    99+
    2022-11-13
  • asp.net Core中如何实现同名服务注册
    这篇文章主要为大家展示了“asp.net Core中如何实现同名服务注册”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“asp.net Core中如何实现同名服务注册”这篇文章...
    99+
    2023-06-29
  • Asp.Net Core怎么使用Ocelot实现服务注册和发现
    本文小编为大家详细介绍“Asp.Net Core怎么使用Ocelot实现服务注册和发现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Asp.Net Core怎么使用Ocelot实现服务注册和发现”文章能帮助大家解决疑惑...
    99+
    2023-06-29
  • Asp.Net Core使用Ocelot结合Consul实现服务注册和发现
    目录1.服务注册与发现(Service Discovery)2.Consul3.Asp.Net Core向Consul注册服务实例4.项目演示4.1APIGateway项目4.2Co...
    99+
    2022-11-13
  • ASP.Net Core MVC中服务注册和管道的示例分析
    这篇文章给大家分享的是有关ASP.Net Core MVC中服务注册和管道的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。DI容器呢, 依赖接口, 所以我们先新建一个接口, 就叫 IW...
    99+
    2023-06-29
  • ASP.NET Core中间件实现限流的代码
    目录一、限流算法1.计数器算法1.1 固定窗口算法1.2 滑动窗口算法2.令牌桶算法3.漏桶算法二、ASP.NET Core中间件实现限流1.中间件代码2.在管道中的使用一、限流算法...
    99+
    2022-11-13
  • ASP.NET Core MVC 中实现中英文切换的示例代码
      哈喽..大家好 很久没有更新了,今天就来一篇最近开发用到的功能,那就是中英文切换,这个实际上也不是高大上,先说一下原理,在.NET Core框架中给我们提供了全球化的类,叫...
    99+
    2022-06-07
    net 示例 ASP.NET MVC core ASP
  • Asp.net Core中实现自定义身份认证的示例代码
    Asp.Net Core中虽然集成了许多常用的身份认证,但很多时候,我们还是需要实现自己的身份认证接口,本文这里就简单的介绍下如何实现自定义身份认证接口。 首先写一个简单的接口...
    99+
    2022-06-07
    自定义 ASP.NET net 示例 core ASP
  • SpringCloud 服务注册中的nacos实现过程
    如下图,org.springframework.cloud.spring-cloud-commons包下定义了一系列接口,其中就包括serviceregistry的系列规范,并通过S...
    99+
    2022-11-13
  • SpringCloud服务注册中的nacos怎么实现
    这篇文章主要介绍了SpringCloud服务注册中的nacos怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud服务注册中的nacos怎么实现文章都会有所收获,下面我们一起来看看吧。如...
    99+
    2023-06-29
  • 微服务架构中如何实现服务的发现和注册?
    随着云计算和大数据时代的到来,传统的单体应用已经逐渐不能满足业务的发展需求。为了更好地应对复杂业务场景下的挑战,微服务架构越来越受到开发者的青睐。在微服务架构中,众多的服务逐渐增加,这就要求系统需要具备服务的发现和注册能力,本文将重点介绍微...
    99+
    2023-05-17
    微服务架构 服务发现 服务注册
  • 5分钟搭建SpringCloud Eureka服务注册中心的实现
    创建父级项目 只需保留pom.xml文件 这里只需搭建一个微服务 其他操作并无 <?xml version="1.0" encoding="UTF-8"?...
    99+
    2022-11-12
  • Spring Cloud如何实现高可用的服务注册中心
    这篇文章主要介绍了Spring Cloud如何实现高可用的服务注册中心,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、准备工作Eureka can be made even...
    99+
    2023-06-19
  • nginx反向代理实现不同域名映射到同一台服务器的相同端口
    在实际应用中,我们经常会遇到多个域名需要映射到同一台服务器的相同端口的情况,这时可以使用nginx反向代理来实现。 以实现将www.example.com和www.test.com都映射到127.0.0.1的80端口为例,具体步骤如下: 修...
    99+
    2023-08-19
    服务器 nginx 运维
  • 【HarmonyOS】低代码元服务开发中的地图实现
    在元服务开发过程中,大家可能需要在应用中使用地图,如果使用SDK集成的方式,地图SDK包体积大小很大,集成后元服务大小可能会超过10M,这就超出了HAP包的大小限制。那么是否有其他途径可以在元服务中使用地图呢?笔者最近在学习AGC新推出的低...
    99+
    2023-09-12
    harmonyos 华为
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作