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());
相关推荐
OH_TPC1 小时前
HarmonyOS APP开发---“滤镜大师“图像处理App,需要用到这个库
java·图像处理·华为·harmonyos·鸿蒙
rockey6272 小时前
基于AScript的Lua脚本语言发布啦
c#·.net·lua·script·动态脚本
imaol12 小时前
链表 -- 环链表
java·前端·链表
imaol13 小时前
链表 -- 双向链表
java·前端·链表
2601_963869953 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
于烛4 小时前
为什么hasNext() 对只有一个元素的集合返回 true?90%初学者都有的疑问
java
wuminyu4 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
imaol14 小时前
数据结构---队列
java·数据结构·算法
半亩码田5 小时前
【.NET新特性·第11篇】C# 14 字段属性:告别手写 backing field
java·c#·.net
曹牧5 小时前
C#:问号
前端·数据库·c#