C# 依赖注入:根据环境调用不同的服务
我正在构建一个.NETCore3.1Web应用程序,并且正在试验内置依赖项注入 我想根据运行应用程序的运行时环境注入不同的服务,我想我可以使用一个属性来定义服务是否适合该环境,例如:C# 依赖注入:根据环境调用不同的服务,c#,.net-core,inversion-of-control,C#,.net Core,Inversion Of Control,我正在构建一个.NETCore3.1Web应用程序,并且正在试验内置依赖项注入 我想根据运行应用程序的运行时环境注入不同的服务,我想我可以使用一个属性来定义服务是否适合该环境,例如: public void ConfigureServices(IServiceCollection services) { ... services.AddTransient<IOperation, OperationDevelopment>(); services.AddTra
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<IOperation, OperationDevelopment>();
services.AddTransient<IOperation, OperationStaging>();
services.AddTransient<IOperation, OperationProduction>();
...
}
public interface IOperation
{
Guid OperationId { get; }
}
[Development]
public class OperationDevelopment : IOperation
{
}
[Staging]
public class OperationStaging : IOperation
{
}
[Production]
public class OperationProduction : IOperation
{
}
我该怎么办,跳过注册?注册所有,然后解决合适的服务?我错过了什么
如果.net核心DI太基本,我应该使用什么
谢谢你能在方法中使用一个简单的if吗?希望能有帮助
if (Environment.IsDevelopment())
{
services.AddTransient<IOperation, OperationDevelopment>();
}
else
{
services.AddTransient<IOperation, OperationProduction>();
}
你能在方法中使用一个简单的if吗?希望能有帮助
if (Environment.IsDevelopment())
{
services.AddTransient<IOperation, OperationDevelopment>();
}
else
{
services.AddTransient<IOperation, OperationProduction>();
}
假设在appsettings.json中,您已经像这样配置了环境变量
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
然后在startup.cs中,捕获环境变量值
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment environment)
{
Configuration = configuration;
Environment = environment;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
In-configureServices捕获主机环境配置
public void ConfigureServices(IServiceCollection services)
{
string currentEnvironment= Environment.EnvironmentName;
if(currentEnvironment== "Development")
{
services.AddTransient<IOperation, OperationDevelopment>();
}
else if (currentEnvironment == "Staging")
{
services.AddTransient<IOperation, OperationStaging>();
}
else if (currentEnvironment == "Production")
{
services.AddTransient<IOperation, OperationProduction>();
}
}
iWebHostenEnvironment适用于.netcore 3.0 iHostenEnvironment适用于.net core 2.2假设在appsettings.json中,如果您已经像这样配置了环境变量
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
然后在startup.cs中,捕获环境变量值
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment environment)
{
Configuration = configuration;
Environment = environment;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
In-configureServices捕获主机环境配置
public void ConfigureServices(IServiceCollection services)
{
string currentEnvironment= Environment.EnvironmentName;
if(currentEnvironment== "Development")
{
services.AddTransient<IOperation, OperationDevelopment>();
}
else if (currentEnvironment == "Staging")
{
services.AddTransient<IOperation, OperationStaging>();
}
else if (currentEnvironment == "Production")
{
services.AddTransient<IOperation, OperationProduction>();
}
}
IWebHostEnvironment适用于.netcore 3.0 IHostEnvironment适用于.net core 2.2您可以执行以下操作:
interface IOperationAttribute
{
}
[Development]
public class OperationDevelopment : IOperation
{
public Guid OperationId { get; }
}
public class DevelopmentAttribute : Attribute, IOperationAttribute
{
}
为IServiceCollection添加新扩展名
public static class AppServiceExtension
{
public static IServiceCollection AppOperationServices(this IServiceCollection services)
{
var typesWithOperationAttribute =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
let attributes = t.GetCustomAttributes(typeof(IOperationAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t };
foreach (var item in typesWithOperationAttribute)
services.AddTransient((Type)item.Type);
return services;
}
}
在ConfigureServices中,只需调用
services.AppOperationServices();
你可以这样做:
interface IOperationAttribute
{
}
[Development]
public class OperationDevelopment : IOperation
{
public Guid OperationId { get; }
}
public class DevelopmentAttribute : Attribute, IOperationAttribute
{
}
为IServiceCollection添加新扩展名
public static class AppServiceExtension
{
public static IServiceCollection AppOperationServices(this IServiceCollection services)
{
var typesWithOperationAttribute =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
let attributes = t.GetCustomAttributes(typeof(IOperationAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t };
foreach (var item in typesWithOperationAttribute)
services.AddTransient((Type)item.Type);
return services;
}
}
在ConfigureServices中,只需调用
services.AppOperationServices();
有Environment.IsStaging和Environment.IsProduction方法,如果它有助于authorWell您的答案是好的,但它不会根据属性注册或解析服务。有Environment.IsStaging和Environment.IsProduction方法如果它有助于authorWell您的答案是好的,但它不会注册或解析服务基于属性。