首页 > 其他分享 >.NET Core IServiceCollection注入 拓展方法

.NET Core IServiceCollection注入 拓展方法

时间:2024-06-02 20:58:13浏览次数:14  
标签:Core Assembly namespaceName IServiceCollection static services NET type types

一般注入比较麻烦,可以不依赖第三方组件命名空间注入

  • using Microsoft.Extensions.DependencyInjection;
  • using Newtonsoft.Json;
  • using System.Reflection;
public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddTransientFromNamespace(
        this IServiceCollection services,
        string namespaceName,
        params Assembly[] assemblies
    )
    {
        foreach (Assembly assembly in assemblies)
        {
            IEnumerable<Type> types = assembly.GetTypes();
           
            types = types.Where(t => t.IsClass);
           
            Console.WriteLine(JsonConvert.SerializeObject(types));
            types = types.Where(x => (x.Namespace??"").StartsWith(namespaceName, StringComparison.InvariantCultureIgnoreCase));
            //types.Where(x =>
            //    x.IsClass
            //    && x.Namespace!.StartsWith(namespaceName, StringComparison.InvariantCultureIgnoreCase)
            //);

            foreach (Type? type in types)
            {
                if (services.All(x => x.ServiceType != type))
                {
                    _ = services.AddTransient(type);
                }
            }
        }

        return services;
    }

    public static IServiceCollection AddSingletonFromNamespace(
    this IServiceCollection services,
    string namespaceName,
    params Assembly[] assemblies
)
    {
        foreach (Assembly assembly in assemblies)
        {
            IEnumerable<Type> types = assembly
                .GetTypes()
                .Where(x =>
                    x.IsClass
                    && x.Namespace!.StartsWith(namespaceName, StringComparison.InvariantCultureIgnoreCase)
                );

            foreach (Type? type in types)
            {
                if (services.All(x => x.ServiceType != type))
                {
                    _ = services.AddSingleton(type);
                }
            }
        }

        return services;
    }


}

使用方法

  class AppAssembly
  {
      public static Assembly ExecutingAsssembly => Assembly.GetExecutingAssembly();
  }

 private static readonly IHost appHost = Host.CreateDefaultBuilder()
     .ConfigureAppConfiguration(c =>
     {
         c.SetBasePath(AppContext.BaseDirectory);
     })
     .ConfigureServices(
         (_, services) =>
         {
             services.AddLogging(loggerBuilder =>
             {
                 var nlog_configfile = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "NLog.config");
                 LogManager.Configuration = new XmlLoggingConfiguration(nlog_configfile);
                 NLog.ScopeContext.PushProperty("workername", "client");
                 loggerBuilder.ClearProviders();
                 loggerBuilder.AddNLog(LogManager.Configuration);
             });
			//  放类  IHostedService是后台服务类.NetCore功能
             services.AddHostedService<HostedService >();    
             //放接口与实现类    
 		     services.AddSingleton<IDemo, Demo>();
 		     //重点 ,命名空间注册...
             services.AddTransientFromNamespace("Demo.AAAA",AppAssembly.ExecutingAsssembly);    
    	     //重点 ,命名空间指定dll...
     	     var assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Demo.BBB.dll");
			 services.AddTransientFromNamespace("Demo.BBB", Assembly.LoadFrom(assemblyPath));
             services.BuildServiceProvider();

    }
) .Build();

标签:Core,Assembly,namespaceName,IServiceCollection,static,services,NET,type,types
From: https://blog.csdn.net/qq_31136349/article/details/139357903

相关文章

  • Kubernetes 多集群通信的五种方案
    Kubernetes多集群通信的五种方案原创 oilbeater 我的观点 2024-05-3108:03 北京 听全文oilbeater读完需要8分钟速读仅需3分钟随着企业的业务规模不断扩大,Kubernetes的使用也从单集群逐步扩展到多集群部署。多集群环境下,集群之间的通信成为一个重要的研究课......
  • Keras深度学习框架实战(3):EfficientNet实现stanford dog分类
    1、通过EfficientNet进行微调以实现图像分类概述通过EfficientNet进行微调以实现图像分类,是一个使用EfficientNet作为预训练模型,并通过微调(fine-tuning)来适应特定图像分类任务的过程。一下是对相关重要术语的解释。EfficientNet:这是一个高效的卷积神经网络(CNN)架构,旨在通过......
  • 推荐一个Github上收集了大量的C#/.NET/.NET Core项目宝库组织
    项目宝库介绍为.NET开发者提供一个寻找优秀C#/.NET/.NETCore项目和框架的入口,通过了解和对比更多的项目和框架来选择最适合我们自己学习、工作开发的一套项目或者框架。优秀的项目不应该被埋没,欢迎大家一起加入这个组织共同完善、发展.NET社区!这些都是非常优秀的项目和框架,排......
  • [DotNetGuide]C#/.NET/.NET Core优秀项目和框架精选
    前言注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯......
  • log4net的配置详解
    log4net是Apache的C#日志系统,下面是详细配置:一,用Nuget安装log4net:12二,修改App.config文件,添加配置项,下面是完整的配置文件内容:<?xmlversion="1.0"encoding="utf-8"?><configuration> <configSections> <sectionname="log4net"type="......
  • Kubernetes——YAML文件编写
    目录一、创建Kubernetes对象YAML文件必备字段1.apiVersion2.kind3.metadata4.spec二、YAML格式基本规范1.结构表示2.键值对3.列表(数组)4.字典(映射)5.数据类型6.注释7.多文档支持8.复杂结构9.示例 三、YAML文件编写1.YAML文件的组成2.生成YAML文件框架2.1--d......
  • NET工控,上位机,Modbus485网口/串口通讯(鸣志步进电机,鸣志伺服电机,松下伺服电机,华庆
    先上两个通用Modbus帮助类,下面这个是多线程不安全版,在多线程多电机同一端口通信下,可能造成步进电机丢步或者输出口无响应等,还有个多线程安全版,只是基于这个不安全版加上了LOCK,THISusingModbus.Device;usingSunny.UI;usingSystem;usingSystem.IO.Ports;usingSystem.Li......
  • Zero Trust Networks【7】
    一、了解应用程序管道二、TrustingSourceCode三、TrustingBuilds四、信任分配五、人在循环中六、信任一个实例七、运行时安全性八、安全软件开发生命周期(SDLC)九、保护应用程序和数据的隐私十、场景演练Chapter7.TrustingApplications硅谷著名投资者马克·安德......
  • Zero Trust Networks【5】
    一、BootstrappingTrust二、正在使用控制平面进行身份验证的设备三、存货[库存]管理四、更新和测量设备的信任关系五、软件配置管理六、使用设备数据进行用户授权七、TrustSignals八、场景演练Chapter5.TrustingDevices在零信任网络中信任设备是极其关键的;这也是......
  • .NET开源、跨平台、使用简单的面部识别库
    .NET开源、跨平台、使用简单的面部识别库.NET开源、跨平台、使用简单的面部识别库 前言今天给大家分享一个.NET开源(MITLicense)、免费、跨平台(适用于Windows、MacOS和Linux)、使用简单的面部识别库:FaceRecognitionDotNet。项目介绍FaceRecognitionDotNet这个项目是 ......