• 【.NET Core开发实战学习笔记】依赖注入框架:管理服务的依赖与生命周期


    第二节 依赖注入框架:管理服务的依赖与生命周期

    为什么要使用依赖注入框架?

    1. 借助依赖注入框架,我们可以轻松的管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性

    2. ASP.NET Core 的整个架构中,依赖注入框架提供了对象创建和生命周期管理的核心功能,各个组件之间的互相协作,也是由依赖注入框架来实现的

    ASP.NET Core中实现依赖注入框架的核心包:

    Microsoft.Extensions.DependencyInjection.Abstractions 

    Microsoft.Extensions.DependencyInjection

    实现的核心类型:

    IServiceCollection

    ServiceDescriptor

    IServiceProvider

    IServiceScope

    依赖注入的生命周期有三种,分别是:

    单例Singleton:根容器生命周期内获取唯一对象

    作用域Scoped:当前容器生命周期内获取唯一对象 如一个http请求生命周期内获取的是同一个对象

    瞬时Transient:每次获取都获取一个新对象

    依赖注入的注册方式有很多种

    可以使用AddXXX系列方法,注入不同生命周期的服务,如:

    泛型注入

    services.AddSingleton<IMySingletonService, MySingletonService>();

    //直接注入实例

    services.AddSingleton<IOrderService>(new OrderService());  

    //工厂方法注入 适用于组装对象或者包装对象

    services.AddSingleton<IOrderService>(serviceProvider =>
    {
      return new OrderServiceEx();
    });

    也可以使用TryAddXXX的系列方法进行尝试注入,即如果容器中已经存在某中类型的注入,则不再进行重复注入,否则进行注入,如:

    services.TryAddSingleton<IOrderService, OrderServiceEx>();

    services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrderService>(new OrderServiceEx()));

    services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrderService>(p =>
    {
      return new OrderServiceEx();
    }));

    还可以对已注入的服务进行替换和移除,如:

    services.Replace(ServiceDescriptor.Singleton<IOrderService, OrderServiceEx>());
    services.RemoveAll<IOrderService>();

    依赖注入框架也支持泛型模板的方式进行注入,如:

    services.AddSingleton(typeof(IGenericService<>), typeof(GenericService<>));

    在使用依赖注入框架时,需要注意以下几点

    1.避免通过静态属性的方式访问容器对象

    2.避免在服务内部使用GetService方式来获得实例

    3.避免使用静态属性存储单例,应该使用容器来管理单例对象

    4.避免在服务中实例化依赖对象,应该使用依赖注入来获得依赖对象

    5.避免向单例的类型注入范围的类型

     
  • 相关阅读:
    MySQL max_allowed_packet设置及问题
    centos 7 编译安装mysql 详细过程
    如何快速查看mysql数据文件存放路径?
    centos yum 库更新
    centos 7 ifconfig 命令找不到
    http协议
    前端那些事儿
    C++接口的定义与实现的详细过程
    List转为字符串
    spring cloud spring boot JPA 克隆对象修改属性后 无法正常的执行save方法进行保存或者更新
  • 原文地址:https://www.cnblogs.com/c-supreme/p/12466215.html
Copyright © 2020-2023  润新知