zoukankan      html  css  js  c++  java
  • 【.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.避免向单例的类型注入范围的类型

     
  • 相关阅读:
    [bzoj1023][SHOI2008]cactus仙人掌图【仙人掌】
    [bzoj1022][SHOI2008]小约翰的游戏John【博弈论】
    [bzoj1021][SHOI2008]Debt 循环的债务【dp】
    [bzoj1020][SHOI2008]安全的航线flight【迭代】【计算几何】
    [bzoj1019][SHOI2008]汉诺塔【dp】
    [bzoj1018][SHOI2008]堵塞的交通traffic【线段树】
    [bzoj1017][JSOI2008]魔兽地图DotR【dp】
    Kafka API使用
    zookeeper单机模式安装配置
    Hadoop伪分布式安装
  • 原文地址:https://www.cnblogs.com/c-supreme/p/12466215.html
Copyright © 2011-2022 走看看