C# 自动依赖注入(反射)
自定义注解 [Injectable],自动依赖注入
View Code
View Code

using Microsoft.Extensions.DependencyInjection; using System; namespace Demo { /// <summary> /// 自定义注解 [Injectable],自动依赖注入 /// </summary> [AttributeUsage(AttributeTargets.Class)] public class InjectableAttribute : Attribute { /// <summary> /// 服务的生命周期 /// </summary> public ServiceLifetime Lifetime { get; } /// <summary> /// 构造函数 /// </summary> /// <param name="lifetime">服务的生命周期</param> public InjectableAttribute(ServiceLifetime lifetime = ServiceLifetime.Transient) { Lifetime = lifetime; } } }
依赖注入容器

using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Demo { /// <summary> /// 依赖注入容器 /// </summary> public static class DIContainer { /// <summary> /// 服务提供者 /// </summary> private static IServiceProvider _serviceProvider; /// <summary> /// 自动注入依赖 /// </summary> public static void AutoInjectDependencies(this IServiceCollection serviceCollection) { ConfigureServices(serviceCollection); _serviceProvider = serviceCollection.BuildServiceProvider(); } /// <summary> /// 注册服务到容器 /// </summary> /// <param name="services"></param> private static void ConfigureServices(IServiceCollection services) { // 获取指定程序集的类 List<Type> types = new List<Type>(); types.AddRange(Assembly.GetExecutingAssembly().GetTypes()); types.AddRange(Assembly.Load("RCS").GetTypes()); // 遍历类 foreach (var type in types) { // 判断类的注解 var injectableAttribute = type.GetCustomAttribute<InjectableAttribute>(); if (injectableAttribute != null) { var lifetime = injectableAttribute?.Lifetime ?? ServiceLifetime.Transient; // 注册类 switch (lifetime) { case ServiceLifetime.Singleton: services.AddSingleton(type); break; case ServiceLifetime.Scoped: services.AddScoped(type); break; case ServiceLifetime.Transient: services.AddTransient(type); break; default: services.AddTransient(type); break; } // 判断是否泛型 if (!type.IsGenericType) { // 判断类是否继承接口 var interfaceType = type.GetInterfaces().FirstOrDefault(); if (interfaceType != null) { // 注册接口 services.AddSingleton(interfaceType, type); switch (lifetime) { case ServiceLifetime.Singleton: services.AddSingleton(interfaceType, type); break; case ServiceLifetime.Scoped: services.AddScoped(interfaceType, type); break; case ServiceLifetime.Transient: services.AddTransient(interfaceType, type); break; default: services.AddTransient(interfaceType, type); break; } } } } } } /// <summary> /// 获取服务实例 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T GetService<T>() { return _serviceProvider.GetRequiredService<T>(); } /// <summary> /// 获取服务实例 /// </summary> /// <param name="type"></param> /// <returns></returns> public static object GetService(Type type) { return _serviceProvider.GetRequiredService(type); } } }
使用方法:
需要注入的类/接口类
[Injectable(ServiceLifetime.Singleton)] public class Class1 {} [Injectable(ServiceLifetime.Singleton)] public class Class1 :IService {}
Startup.cs
// 自动注入依赖 services.AutoInjectDependencies();
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战