我得到了一个带有.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>();
}
}
这可能对你有用:
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>()));
}