• 【.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.避免向单例的类型注入范围的类型

     
  • 相关阅读:
    这是一篇乖巧的草稿——vscode上传代码到代码托管平台GitHub
    性能测试基础及练习
    adb
    前端常用的设计模式
    Vue Router 路由实现原理
    XSS与CSRF区别及防范
    vue中函数的防抖节流
    axios 使用post方式传递参数,后端接受不到
    类数组转换为数组的方法
    深入理解原型,原型链的关系
  • 原文地址:https://www.cnblogs.com/c-supreme/p/12466215.html
Copyright © 2020-2023  润新知