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());
相关推荐
程序猿小D4 分钟前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
小码编匠39 分钟前
C# 上位机开发怎么学?给自动化工程师的建议
后端·c#·.net
转转技术团队42 分钟前
二奢仓店的静默打印代理实现
java·后端
cdbqss11 小时前
VB.net编写的身份证类
前端·.net
钢铁男儿1 小时前
C# 接口(什么是接口)
java·数据库·c#
ChaITSimpleLove1 小时前
.NET9 实现字符串拼接(StringConcatenation)性能测试
.net·性能测试·字符串拼接·csharp·string 拼接·benchmarktest
丶小鱼丶1 小时前
排序算法之【归并排序】
java·排序算法
上上迁1 小时前
分布式生成 ID 策略的演进和最佳实践,含springBoot 实现(Java版本)
java·spring boot·分布式
永日456701 小时前
学习日记-spring-day42-7.7
java·学习·spring
龙谷情Sinoam2 小时前
扩展若依@Excel注解,使其对字段的控制是否导出更加便捷
java