当前位置: 首页 > article >正文

.NET8/.NETCore 依赖注入:自动注入项目中所有接口和自定义类

ASP.NETCore/WebApi 自动依赖注入接口和类-开发框架文库

.NET8/.NETCore 依赖接口注入:自动注入项目中所有接口和自定义类

目录

  • 自定义依赖接口
  • 扩展类:HostExtensions AddInjectionServices方法
  • GlobalAssemblies 全局静态类
  • 测试

自定义依赖接口

需要依赖注入的类必须实现以下接口。

C#

    /// <summary>
    /// 依赖接口
    /// </summary>
    public interface IDependency { }

    /// <summary>
    /// 注入接口,生命周期:Transient
    /// </summary>
    public interface ITransientDependency : IDependency { }

    /// <summary>
    /// 注入接口,生命周期:Scoped
    /// </summary>
    public interface IScopedDependency : IDependency { }

    /// <summary>
    /// 注入接口,生命周期:Singleton
    /// </summary>
    public interface ISingletonDependency : IDependency { }

扩展类:HostExtensions AddInjectionServices方法

C#

 public static class HostExtensions
 {
     /// <summary>
     /// 自动注入接口, 注入到服务容器IServiceCollection
     /// </summary>
     /// <param name="services"></param>
     /// <returns></returns>
     public static IServiceCollection AddInjectionServices(this IServiceCollection services)
     {
         //服务生命周期映射
         Dictionary<Type, ServiceLifetime> map = new Dictionary<Type, ServiceLifetime>
         {
             { typeof(ITransientDependency),ServiceLifetime.Transient },
             { typeof(IScopedDependency),ServiceLifetime.Scoped },
             { typeof(ISingletonDependency),ServiceLifetime.Singleton },
             { typeof(IDependency),ServiceLifetime.Scoped },
         };

         //获取程序集所有实体模型Type
         var listTypes = GlobalAssemblies.GetTypes();
         
         foreach (var type in listTypes)
         {
             map.ToList().ForEach(aMap =>
             {
                 //依赖注入接口
                 var interfaceDependency = aMap.Key;
                 if (interfaceDependency.IsAssignableFrom(type) && interfaceDependency != type && !type.IsAbstract && type.IsClass)
                 {
                     //注入实现
                     Console.WriteLine("注入实现:" + type.FullName + ", " + aMap.Value.ToString());                        
                     services.Add(new ServiceDescriptor(type, type, aMap.Value));

                     //获取当前类的所有接口
                     var interfaces = listTypes.Where(x => x.IsInterface && x.IsAssignableFrom(type) && x != interfaceDependency).ToList();

                     //有接口,注入接口
                     if (interfaces.Count > 0)
                     {
                         interfaces.ForEach(@inteface =>
                         {
                             Console.WriteLine("注入接口:" + type.FullName + "," + @inteface.FullName + ", " + aMap.Value.ToString());
                             services.Add(new ServiceDescriptor(@inteface, type, aMap.Value));
                         });
                     }
                 }
             });
         };

         return services;
     }
 }

GlobalAssemblies 全局静态类

加载程序集Assembly。

作用:

  • 用于初始化CSFramework.EF组件(注册实体模型)
  • 用于获取所有接口和类,依赖注入服务

C#

    public static class GlobalAssemblies
    {
        /// <summary>
        /// 加载程序集Assembly。
        /// 作用:1.用于初始化CSFramework.EF组件(注册实体模型)
        ///      2.用于获取所有接口和类,依赖注入服务
        /// </summary>
        /// <param name="hostBuilder"></param>
        /// <returns></returns>
        public static void LoadAssemblies()
        {
            //加载以下程序集(包含所有实体模型、自定义服务的程序集)
            GlobalAssemblies.Assemblies = new List<System.Reflection.Assembly>
           {
                //如:CSFramework.LicenseServerCore.dll
                System.Reflection.Assembly.Load("CSFramework.LicenseServerCore"),
                System.Reflection.Assembly.Load("CSFramework.Models"),
           };
        }

        /// <summary>
        /// WebApi框架所有程序集
        /// </summary>
        public static List<System.Reflection.Assembly> Assemblies { get; set; }

        /// <summary>
        /// WebApi框架所有类型Types
        /// </summary>
        public static List<System.Type> GetTypes()
        {
            return Assemblies.SelectMany(m => m.GetExportedTypes()).ToList();
        }

    }

测试

.NET8/.NETCore 依赖接口注入:自动注入项目中所有接口和实体类


http://www.kler.cn/a/420109.html

相关文章:

  • MFC工控项目实例三十五读取数据库数据
  • 前端开发 之 15个页面加载特效上【附完整源码】
  • xiaolin coding 图解 MySQL笔记——事务篇
  • Prometheus 生产监控部署教程(一)
  • 单片机(Single-Chip Microcomputer)是一种集成电路芯片
  • 算法训练(leetcode)二刷第三十三天 | *322. 零钱兑换、*279. 完全平方数、*139. 单词拆分
  • HarmonyOS NEXT应用开发,关于useNormalizedOHMUrl选项的坑
  • ES6-14面试题
  • STM32G4系列MCU的Direct memory access controller (DMA)功能介绍之二
  • mysql 5.7安装及安装后无法启动问题处理
  • C++:unordered_map与unordered_set详解
  • 2-jsp-实现增删改功能
  • 【从0学英语】形容词性/名词性物主代词是什么?
  • 深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接
  • 一.准备环境,从零开始搭建项目
  • Hive学习基本概念
  • Java 中 ArrayList 与 LinkedList 的详细比较
  • 什么是 KDE?
  • numpy.float8不存在;Python中,实现16位浮点数
  • 种花问题算法
  • 运维工作常用Shell脚本(Commonly Used Shell Scripts for Operation and Maintenance Work)
  • 深入解析 Python 异步编程中的 `gather`、`as_completed` 和 `wait`
  • SQL注入--基本概念
  • 01-标准库开发-STM32定时器
  • 为什么在服务器上设置 fish 为默认 shell, vscode remote ssh 默认还是 bash?
  • flink学习(13)—— 重试机制和维表join