Asp.Net Core学习笔记7——依赖注入

Asp.Net Core学习笔记7——依赖注入

1.什么是依赖注入

  我们想要弄明白依赖注入是什么,首先得了解什么是依赖?简而言之,依赖是指一个类使用了另一个类,这两个类之间得关系是临时、偶然的,这种关系联系不够紧密。例如一个学生需要用笔完成书写的作业。此时学生与笔之间的关系就是依赖关系。依赖注入(Dependency Injection,简称DI)就是把有依赖关系的类存放到容器中,通过外部以参数或其他形式注入
  我们在查资料时,常常发现控制反转(Inversion Of Control,简称IOC)与DI形影不离,那么怎样理解IOC?IOC可以简单理解为:把组件间的依赖关系从程序内部提到外部来管理。例如我们在登录时使用Log4Net工具记录日志信息,常有这样的写法:

public class LoginController : ControllerBase
 {
    ILogService _logService;
         
    public LoginController()
    { 
        _logService = new Log4NetService(); 
   }
}

  LoginController控制器使用了ILogService 接口完成记录信息的操作,LoginController对ILogService产生依赖,而我们定义Log4Net实现ILogService接口。倘若我们想换System.Logger写日志,就要改LoginController的代码,把“newLog4NetService();”改成LoggerService类。那么后面不想用System.Logger,想用Log4Net写日志,这样也要改代码。

  如果我们把代码写成这样:

 public class LoginController : ControllerBase
 {
    private ILogService _logService;
         
    public LoginController(ILogService logService)
    { 
        _logService = logService(); 
    }
}

  外界通过LoginController的构造方法把ILogService这个依赖传进来, LoginController 只需要完成自己的任务,不用考虑使用哪种方式写日志。这种方式就是IOC,由LoginController 控制的ILogService变成了通过外部灵活控制的方式,从而实现了解耦合

 

2.实例的注册

2.1 在Startup类的ConfigureServices中注入:

public void ConfigureServices(IServiceCollection services)
{ 
    services.AddTransient<ILogService, Log4NetService>(); 
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

2.2 在构造函数传入实例:

 public class LoginController : ControllerBase
 {
    private ILogService _logService;
         
    public LoginController(ILogService logService)
    { 
        _logService = logService(); 
    }
}

 

3.三种依赖注入模式

 

AddSingleton():一般情况下,一个应用程序只创建一次Singleton服务,在整个应用程序生命周期中使用这个服务。写日志会用到这种注入方式。
AddScoped():在范围内的每个请求中创建一个新的 Scoped 服务实例。在用户登录时,获取登录系统用户的Id,也会用到这种注入方式。
AddTransient():每次请求时,都会创建一个新的 Transient 服务实例。一般写的业务都是这种。

 

 

  

posted @ 2020-07-15 19:48  落叶窥秋  阅读(228)  评论(0编辑  收藏  举报