C# 依赖注入:根据环境调用不同的服务

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

我正在构建一个.NETCore3.1Web应用程序,并且正在试验内置依赖项注入

我想根据运行应用程序的运行时环境注入不同的服务,我想我可以使用一个属性来定义服务是否适合该环境,例如:

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您的答案是好的,但它不会注册或解析服务基于属性。