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());
相关推荐
He少年30 分钟前
【AI 辅助案例分享】
人工智能·c#·编辑器·ai编程
身如柳絮随风扬34 分钟前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务
Java小生不才1 小时前
Spring AI文生音
java·人工智能·spring
凯尔萨厮1 小时前
Springboot2.x+Thymeleaf项目创建
java
fish_xk1 小时前
map和set
java·开发语言
李崧正2 小时前
Java技术分享:Lambda表达式与函数式编程
java·开发语言·python
老了,不知天命2 小时前
鳶尾花項目JAVA
java·开发语言·机器学习
二哈赛车手2 小时前
新人笔记---实现简易版的rag的bm25检索(利用ES),以及RAG上传时的ES与向量数据库双写
java·数据库·笔记·spring·elasticsearch·ai
winner88812 小时前
从零吃透C++命名空间、std、#include、string、vector
java·开发语言·c++
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第26题:Java的抽象类和接口有哪些区别
java·开发语言·面试