zoukankan      html  css  js  c++  java
  • 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 服务实例。一般写的业务都是这种。

     

      

  • 相关阅读:
    关于Java中String类的hashCode方法
    重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源
    vue+eslint+prettier+vetur 使用vscode 前端工程化
    vue webpack 打包优化
    移动端兼容
    vue 跨域使用
    vue2.0性能优化
    前端 mock的使用
    vue 使用Lodash 的throttle(节流)与debounce(防抖
    webpack4 安装及使用
  • 原文地址:https://www.cnblogs.com/nmmking/p/13307317.html
Copyright © 2011-2022 走看看