增量生成器(Incremental Generator)实现自动注入

46 阅读1分钟

在之前呢,为了偷懒,是使用了反射在项目启动的时候,自动注入项目需要的服务

现在改为使用源生成器,自动生成服务注入的代码

nuget地址

dotnet add package AutoInjectGenerator --version 0.0.3

一个提供了3个Attribute用于自动注入的配置

  • AutoInjectAttribute
  • AutoInjectContextAttribute
  • AutoInjectConfiguration

AutoInjectAttribute

用于标注需要注册的服务实现
可选参数
  • LifeTime注入的服务的生命周期,默认Scope
  • ServiceType注入的服务的抽象类型services.AddScope<TService, TImpl>中的TService
  • Group一般情况可忽略

// services.AddScope<Test, Test>()
[AutoInject]
public class Test {}

// services.AddScope<ITest, Test>()
[AutoInject]
public class Test : ITest {}

// services.AddScope<Test, Test>()
[AutoInject(ServiceType = typeof(Test))]
public class Test : ITest {}

// services.AddScope<Test, Test>()
// services.AddScope<ITest, Test>()
[AutoInject(ServiceType = typeof(Test))]
[AutoInject(ServiceType = typeof(ITest))]
public class Test : ITest {}

AutoInjectContextAttribute

用于标注需要生成注入方法的地方
[AutoInjectContext]
public static class AutoInjectContext
{
    public static partial void AutoInject(this IServiceCollection services);
}
生成的代码
/// <inheritdoc/>
static partial class AutoInjectContext 
{
    public static partial void AutoInject(this Microsoft.Extensions.DependencyInjection.IServiceCollection services)
    {
        services.AddScoped<Test>();
        services.AddScope<ITest, Test>()
    }
}

目前存在的问题,无法检测到其他生成器生成的类型

源码地址