首页 > 其他分享 >dotNet 整合 Microsoft.Extensions.DependencyInjection 利用反射实现依赖批量注入

dotNet 整合 Microsoft.Extensions.DependencyInjection 利用反射实现依赖批量注入

时间:2024-11-05 14:43:04浏览次数:1  
标签:string var services Extensions using dotNet DependencyInjection public

前言

框架
.net 8.0
Microsoft.Extensions.DependencyInjection 8.0
创建三个类库项目
ConfigServices
LogServices
MailServices
创建一个控制台项目
ConsoleAppMail

ConfigServices

 namespace ConfigServices.IService
{
    public interface IConfigService
    {
        public string GetValue(string key);
    }
}
 namespace ConfigServices.IService
{
    public class EnvVarConfigServiceImpl : IConfigService
    {
        public string GetValue(string key)
        {
            return Environment.GetEnvironmentVariable(key);
        }
    }
}

LogServices

namespace LogServices.IService
{
    public interface ILogProvider
    {
        public void LogInfo(string message);
        public void LogError(string message);
    }
}
 namespace LogServices.IService
{
    public class LogProviderImpl : ILogProvider
    {
        public void LogInfo(string message)
        {
            Console.WriteLine($"INFO:{message}");
        }

        public void LogError(string message)
        {
            Console.WriteLine($"ERROR:{message}");
        }
    }
}

MailServices

 public interface IMailService
 {
     public void Send(string title, string to, string body);
 }

在邮件服务里面需要引用 LogProvider 和 ConfigService 在这里需要依赖项里面添加项目引用,在 Microsoft.Extensions.DependencyInjection 里面默认是采用构造函数注入,只需要在构造函数中编写就可以了,在创建对象的时候 DependencyInjection 框架会帮助我们实现依赖注入(DI)。

namespace MailServices.IService
{
    public class MailServiceImpl : IMailService
    {
        private readonly ILogProvider log;
        private readonly IConfigService config;
        public MailServiceImpl(ILogProvider log, IConfigService config)
        {
            this.log = log;
            this.config = config;
        }
        public void Send(string title, string to, string body)
        {
            log.LogInfo("准备发送邮件");

            string smtpServer = this.config.GetValue("smtpServer");
            string username = this.config.GetValue("username");
            string password = this.config.GetValue("password");
            Console.WriteLine($"邮件服务器地址{smtpServer},{username},{password}");
            Console.WriteLine("发邮件!");
            log.LogInfo("邮件发送完成");
        }
    }
}

ConsoleAppMail

在控制台项目相当于我们的启动项, 需要告诉 DependencyInjection 框架那些类需要注入到容器中。

单个注入

单个注入比较麻烦,假如有100个service 就需要在Main 函数里面写100个,所以就有了通过反射的方式来批量注入。

using ConfigServices.IService;
using LogServices.IService;
using MailServices.IService;
using Microsoft.Extensions.DependencyInjection;
namespace ConsoleAppMail
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddScoped<ILogProvider,LogProviderImpl>();
            services.AddScoped<IConfigService,EnvVarConfigServiceImpl>();
            services.AddScoped<IMailService,MailServiceImpl>();
            using (var sp = services.BuildServiceProvider())
            {
                var mailService = sp.GetRequiredService<IMailService>();
                mailService.Send("hello", "[email protected]", "你好 朋友");
            }
            Console.ReadLine();
        }
    }
}

批量注入

通过反射可以批量读取程序集信息,将对应的接口和对应的实现类注入到IOC 容器中。

using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
namespace ConsoleAppMail.util
{
    public static class ServiceCollectionExtensions
    {
        /// <summary>
        /// 批量注册指定程序集中的所有实现了接口的类到 ServiceCollection
        /// </summary>
        /// <param name="services">ServiceCollection 实例</param>
        /// <param name="assembly">要扫描的程序集</param>
        public static IServiceCollection RegisterServicesFromAssembly(this IServiceCollection services, Assembly assembly)
        {
             
            var types = assembly.GetTypes()
                .Where(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Any()); // 筛选出实现接口的类
            foreach (var type in types)
            {
                var serviceInterface = type.GetInterfaces().FirstOrDefault();
                if (serviceInterface != null)
                {
                    services.AddScoped(serviceInterface, type); // 注册为 Scoped 生命周期
                }
            }
            return services;
        }
    }
}

 static void Main(string[] args)
 {

     var assembly1 = Assembly.Load("ConfigServices");
     var assembly2 = Assembly.Load("LogServices");
     var assembly3 = Assembly.Load("MailServices");


     ServiceCollection services = new ServiceCollection();
     // 批量注册当前程序集中的服务
     services.RegisterServicesFromAssembly(assembly1);
     services.RegisterServicesFromAssembly(assembly2);
     services.RegisterServicesFromAssembly(assembly3);

     using (var sp = services.BuildServiceProvider())
     {
         var mailService = sp.GetRequiredService<IMailService>();
         mailService.Send("hello", "[email protected]", "你好 朋友");

     }
     Console.ReadLine();
 }

通过该例子可以了解一哈 DependencyInjection 框架的基本使用方式,使用前需要了解一下依赖注入(DI)和IOC 容器的知识。

标签:string,var,services,Extensions,using,dotNet,DependencyInjection,public
From: https://www.cnblogs.com/ChaFan/p/18527914

相关文章

  • 物体检测框架YoloDotNet初体验
    一、 什么是YoloYouOnlyLookOnce是基于深度学习的一种实时目标检测算法。有速度快、实时性好的特点。Yolo依赖Python和相关深度学习框架。二、什么是YoloDotNetYoloDotNet是Yolo在.NET平台的实现,基于C#.NET8,开发者可以使用熟悉的C#语开发部署。YoloDotNet能够在图像和视频......
  • webapi dotnet Program.cs 的封装
    webapidotnetProgram.cs的封装精简代码拆分成两个部分RegisterServices(builder);和ConfigureApplication(app);或者使用代码块,大括号来进行拆分.usingHtmlTags;usingMediatR;usingMicrosoft.AspNetCore.Builder;usingMicrosoft.EntityFrameworkCore;usingMic......
  • asp.net dotnet razor page mvc 过滤器 数据验证过滤器 数据库事务过滤器
    asp.netdotnetrazorpagemvc过滤器数据验证过滤器数据库事务过滤器Program.cs注册过滤器services.AddRazorPages(opt=>{opt.Conventions.ConfigureFilter(newDbContextTransactionPageFilter());opt.Conventions.ConfigureFilter(n......
  • 制作一个龙芯旧世界的 dotnet sdk docker 镜像
    以下是我的dockerfile文件,内容特别简单FROMcr.loongnix.cn/library/debian:busterWORKDIR/rootRUNapt-getupdate-y&&\apt-getinstall-y--no-install-recommends\apt-transport-https\ca-certificates\curl\git......
  • dotnet core微服务框架Jimu ~ 会员授权微服务
    提供授权服务,用户使用会员的用户名和密码获取token,带着token访问受保护的接口,如浏览和发布新闻。有2个公开的api:token:获取token;GetCurrentMemberInfo:获取当前token的会员信息;有1个不公开的方法:GetMemberInfo:根据会员用户名和密码,获取会员信息,该方法供......
  • dotnet core微服务框架Jimu介绍
    jimu是一个基于.Net6.0简单易用的微服务框架,参考了很多开源库以及想法,使用了大量的开源库(如DotNetty,consul.net,Flurl.Http,Json.net,Log4net,Quartz.net...),支持分布式、高并发和负载均衡,实现了服务治理(如服务注册、发现、健康检测...)和RPC调用。jimu(积木),正......
  • dotnet core微服务框架Jimu介绍
    jimu是一个基于.Net6.0简单易用的微服务框架,参考了很多开源库以及想法,使用了大量的开源库(如DotNetty,consul.net,Flurl.Http,Json.net,Log4net,Quartz.net...),支持分布式、高并发和负载均衡,实现了服务治理(如服务注册、发现、健康检测...)和RPC调用。jimu(积木),正如......
  • 2019-9-2-dotnet-命名管道名字长度限制
    titleauthordateCreateTimecategoriesdotnet命名管道名字长度限制lindexi2019-09-0211:54:50+08002019-09-0211:54:49+0800dotnet在dotnet里面可以使用NamedPipeClientStream作为命名管道,此时的命名有长度限制,要求在256字符之内从官方文档可以看到限制256字符内Thee......
  • YoloDotNet:强大的实时目标检测工具
    文章目录一、引言二、YoloDotNet概述三、Yolo算法原理四、YoloDotNet的安装与使用1、安装环境要求2、安装步骤3、使用方法五、YoloDotNet的功能与优势1、GPU加速2、多模型集成3、自定义模型与训练4、实际应用案例六、总结一、引言  在当今的计算机视觉领域......
  • YoloDotNet v2.1:实时物体检测的利器
    https://www.cnblogs.com/shanyou/p/18457208 项目介绍YoloDotNetv2.1是一个基于C#和.NET8的实时物体检测框架,专为图像和视频中的物体检测而设计。它集成了Yolov8~Yolov11模型,通过ML.NET和ONNX运行时实现高效的物体检测,并支持GPU加速(使用CUDA)。YoloDotNet......