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
});
}
}