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());
相关推荐
学长毕业设计4 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西4 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西5 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午5 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065255 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
小范同学_5 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu6 小时前
CSharp: 万年历
开发语言·后端·c#·.net
予昊6 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
2601_962203516 小时前
【SpringAI入门】初识SpringAI
java
weixin_461408587 小时前
Mybatis-flex小记
java·开发语言·mybatis