Net Core一个接口多个实现类注入方式

1 IoC和DI概念

IoC 控制反转,是一种设计模式,一种思想

DI 依赖注入,依赖注入是对控制反转的思想的一种实现。

依赖注入的实现方式

构造器注入,属性注入,方法注入

2 Net Core中有三种依赖注入方式

Transient :每次请求时都会创建,并且永远不会被共享

Scoped : 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)

Singleton :只会创建一个实例。该实例在需要它的所有组件之间共享。因此总是使用相同的实例。

-----------------------------------------------------分割线,以下为正文--------------------------------------------------

一般情况下,都是一个类,一个注入,比如:

services.AddTransient<IService, Service>();

但是,偶尔会出现如下的操作:

services.AddTransient<IService, Service1>();
services.AddTransient<IService, Service2>();

一个接口,如何实现注入多个实现类?详细代码如下:

使用注入方法”AddTransient<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory)“ 来实现

services.AddTransient<Service1>();
            services.AddTransient<Service2>();
            services.AddTransient(serviceProvider =>
            {
                Func<Type, IService> accesor = key =>
                {
                    if (key == typeof(Service1))
                        return serviceProvider.GetService<Service1>();
                    else if (key == typeof(Service2))
                        return serviceProvider.GetService<Service2>();
                    else
                        throw new ArgumentException($"不支持的DI Key: {key}");
                };
                return accesor;
            });

Controller中使用方式:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
 {
        readonly IService _Service1;
        readonly IService _Service2;
        public ValuesController(Func<Type, IService> func)
        {
            _Service1 = func(typeof(Service1));
            _Service2 = func(typeof(Service2));
        }
        [HttpGet]
        public async Task<IActionResult> Get()
        {
            var di1=await _Service1.Test();
            var di2 = await _Service2.Test();

            return Ok(new
            {
                di1 = di1,
                di2= di2
            });
        }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值