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 服务实例。一般写的业务都是这种。

     

      

  • 相关阅读:
    EF实体框架处理实体之间关联关系与EF延迟机制(下)
    EF Code First Migrations数据库迁移
    EF的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
    学习Entity Framework 中的Code First
    使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(四)-- Middleware
    学习ASP.NET Core,你必须了解无处不在的“依赖注入”
    EF Code First 学习笔记:表映射 多个Entity到一张表和一个Entity到多张表
    OWIN and Katana
    ASP.NET Core 1.0基础之依赖注入
    Mysql支持的数据类型(总结)
  • 原文地址:https://www.cnblogs.com/nmmking/p/13307317.html
Copyright © 2011-2022 走看看