Dependency injection
IOC(控制反转)是啥? 借助第三方来实现依赖关系之间的解耦
在原来A对象获取B对象时,由主动获取一个B对象,变为了ioc主动创建一个B对象给予A。造成了A对象由主动行为变为了被动行为,则称为控制反转。(A在获得依赖对象的过程被反转了)
DI(依赖注入)又是啥?
在IOC运行期间,动态的将某种依赖关系注入到对象中。
IOC 和 DI 都是描述的同一件事情,只是通过了不同的角度来看待这个过程。
在ASP.NET CORE中提供了DI容器
自带的DI容器中提供了三种方法,分别是三种不同的生命周期
1、Transient每次调用都是不同的实例,比如常用的Microsoft.Extensions.Options.IConfigureOptions<T>;
2、Scoped每次请求是同一个实例,如 Entity Framework contexts;
3、Singleton只有一个实例,如Microsoft.Extensions.Logging.ILogger<T>;
具体使用哪种,要根据具体情况而定;
1、比如我们一般的业务逻辑都是Transient,这个也是比较常用的;
2、Scoped相对用的比较少,当然也有很多业务逻辑也有用Scoped的;当然他的妙用肯定是每次请求一个实例,比如我们在系统中获取登录系统用户的Id,这时就可以用Scoped,不管在Service层或者Repository层等等,获取的都是同一个用户;
3、Singleton很多都是系统级别设计用单利,比如日志;
使用方式
class Startup
//在Startup类的ConfigureServices方法中设置注入
public void ConfigureServices (IServiceCollection services) {
services.AddTransient<IService, Service> ();
}
//使用构造函数的方式获取实例
public class ServiceController : Controller {
private readonly IService _service;
public ServiceController ( IService service) {
_service= service;
}
此外还可以用其他的容器来替换自带的DI容器 如:Autofac