C# .NET如何自动实现依赖注入(DI)

为解决重复性的工作,自动实现依赖注入(DI)

示例代码如下

csharp 复制代码
namespace DialysisSOPSystem.Infrastructure
{
    public static class ServiceCollectionExtensions
    {
        /// <summary>
        /// 批量注入服务
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection RegisterAutoInjectServices(this IServiceCollection services)
        {
            ArgumentNullException.ThrowIfNull(services);

            //获取当前Host运行依赖的程序集
            var context = DependencyContext.Default;
            var assemblies = context.RuntimeLibraries
                .SelectMany(lib => lib.GetDefaultAssemblyNames(context))
                .Select(Assembly.Load)
                .ToList();
            services.Scan(scan => scan
                     .FromAssemblies(assemblies)
                     .AddClasses(classes => classes.AssignableTo<ITransientDependency>())
                     .AsImplementedInterfaces()
                     .WithTransientLifetime()
                     .AddClasses(classes => classes.AssignableTo<IScopedDependency>())
                     .AsImplementedInterfaces()
                     .WithScopedLifetime()
                     .AddClasses(classes => classes.AssignableTo<ISingletonDependency>())
                     .AsImplementedInterfaces()
                     .WithSingletonLifetime());
            return services;
        }
    }
}
csharp 复制代码
namespace DialysisSOPSystem.Infrastructure
{
    public interface ITransientDependency { }

    public interface IScopedDependency { }

    public interface ISingletonDependency { }
}

 //1、Transient(瞬态):每次从容器 (IServiceProvider)中获取的时候都是一个新的实例
 //2、Singleton(单例):每次从同根容器中(同根 IServiceProvider)获取的时候都是同一个实例
 //3、Scoped(应用程序域单例):每次从同一个容器中获取的实例是相同的、
csharp 复制代码
Startup类
public void ConfigureServices(IServiceCollection services)
{
    services.RegisterAutoInjectServices();

    // 添加控制器
    services.AddControllers();

    // 添加Swagger
    services.AddEndpointsApiExplorer();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new() { Title = "Dialysis SOP API", Version = "v1" });
    });

    // 添加AutoMapper
    services.AddAutoMapper(typeof(Startup).Assembly);
}

web 项目引用关系如下

csharp 复制代码
//这段代码获取程序集,上面的web引用service和接口、仓储
 var context = DependencyContext.Default;
            var assemblies = context.RuntimeLibraries
                .SelectMany(lib => lib.GetDefaultAssemblyNames(context))
                .Select(Assembly.Load)
                .ToList();
 //只能拿到当前所在的类库下的程序集
//var assemblies = AppDomain.CurrentDomain.GetAssemblies();
//或者显示引用,就不在web把其他依赖项拉进去

// 从指定路径加载程序集
var assemblyPath = Path.Combine(AppContext.BaseDirectory, "YourProject.Services.dll");
var serviceAssembly = Assembly.LoadFrom(assemblyPath);
// 添加到 DI 扫描范围
var assemblies = new[] { serviceAssembly }.Concat(AppDomain.CurrentDomain.GetAssemblies());
相关推荐
Miraitowa_cheems2 分钟前
LeetCode算法日记 - Day 59: 字母大小写全排列、优美的排列
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先
workflower35 分钟前
将图片中的图形转换为可编辑的 PPT 图形
java·开发语言·tomcat·powerpoint·个人开发·结对编程
ajassi200035 分钟前
开源 C# 快速开发(十六)数据库--sqlserver增删改查
windows·开源·c#
卡戎-caryon1 小时前
【Java SE】06. 数组
java·开发语言
想躺平的咸鱼干1 小时前
Spring AI Alibaba
java·人工智能·spring
老华带你飞2 小时前
学生信息管理系统|基于Springboot的学生信息管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·学生信息管理系统
聪明的笨猪猪2 小时前
Java SE “泛型 + 注解 + 反射”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
磨十三2 小时前
C++ 类型转换全面解析:从 C 风格到 C++ 风格
java·c语言·c++
Zzzzmo_2 小时前
Java数据结构:ArrayList与顺序表2
java·数据结构
Fency咖啡3 小时前
Spring 基础核心 - SpringMVC 入门与请求流程
java·后端·spring·mvc