如何根据 .NET 6 中的类型有条件地将依赖项注入到服务中?

问题描述 投票:0回答:1

我得到了一个带有.NET 6的C# gRPC sln(不确定它的grpc对这个问题是否重要),它有2个不同的C#类,它们实现了2个不同的grpc服务的逻辑,这些服务派生自2个不同的服务中定义的2个不同的服务原型文件:

public class MyServiceV2 : My_Service.My_ServiceBase
public class MyServiceV3 : My_Service_V3.My_Service_V3Base

这两个服务同时并行运行并注册其端点。

这两个类都有一个以

ClassA
作为参数的构造函数。 还有来自
ClassA
的派生类:

public class ClassAV2 : ClassA
public class ClassAV3 : ClassA

如何在启动文件中创建 DI,以便在

MyServiceV2
参数的构造函数中为
ClassAV2
注入
ClassA
,而
MyServiceV3
则注入
ClassAV3

注意:服务不能将参数作为实际类,因为生产环境和非生产环境有不同的行为:在生产环境中,它应该像我上面写的那样,但对于非生产环境,参数应该是仅注入底座

ClassA
。我知道如何区分产品环境和非产品环境,只是不知道如何在产品环境中注入特定服务。

添加伪代码到我想要实现的目标:

public void ConfigureServices(IServiceCollection services)
{
    if(InProduction()) //already got this
    {
       services.FindService(typeof(MyServiceV2)).AddSingleton<ClassA, ClassAV2>();
    services.FindService(typeof(MyServiceV3)).AddSingleton<ClassA, ClassAV3>();
    }
    else
    {
       services.AddSingleton<ClassA>();
    }
}
c# asp.net dependency-injection
1个回答
0
投票

这可能对你有用:

public void ConfigureServices(IServiceCollection services)
{
    bool isProd = InProduction();

    services.AddSingleton<ClassA>();
    services.AddSingleton<ClassAV2>();
    services.AddSingleton<ClassAV3>();

    services.AddTransient<MyServiceV2>(sp =>
        ActivatorUtilities.CreateInstance<MyServiceV2>(
            isProd
                ? sp.GetRequiredService<ClassAV2>()
                : sp.GetRequiredService<ClassA>()));

    services.AddTransient<MyServiceV3>(sp =>
        ActivatorUtilities.CreateInstance<MyServiceV3>(
            isProd
                ? sp.GetRequiredService<ClassAV3>()
                : sp.GetRequiredService<ClassA>()));
}
© www.soinside.com 2019 - 2024. All rights reserved.