C# 具有不同依赖项注入的AspNet核心路由映射

C# 具有不同依赖项注入的AspNet核心路由映射,c#,dependency-injection,asp.net-core,C#,Dependency Injection,Asp.net Core,我目前正在从事一个项目,在该项目中,我希望在服务器上用于两个不同的目的:测试模式和发布模式。我正在使用AspNet核心和中间件管道来尝试实现这一点。我希望在url中使用类似于anything“/Test”的方式来做一件事,而其他方式则可以做另一件事。通常我知道如何解决这些问题,因为AspNet核心中间件允许使用app.Map(“/Test”,…)映射到路径,但问题是它们都使用相同的管道,只是不同的依赖注入/IoC容器。从我看到的情况来看,ConfigureServices方法在Configure

我目前正在从事一个项目,在该项目中,我希望在服务器上用于两个不同的目的:测试模式和发布模式。我正在使用AspNet核心和中间件管道来尝试实现这一点。我希望在url中使用类似于anything“/Test”的方式来做一件事,而其他方式则可以做另一件事。通常我知道如何解决这些问题,因为AspNet核心中间件允许使用app.Map(“/Test”,…)映射到路径,但问题是它们都使用相同的管道,只是不同的依赖注入/IoC容器。从我看到的情况来看,ConfigureServices方法在Configure方法之前运行,并且没有针对要使用的服务的每个请求路径进行配置。因此,我只需要一种方法来实现相同的管道,但不同的请求会为IoC容器使用不同的服务。

我不建议您尝试这样做,您只会让您的工作更加困难

而是使用ASP.NET Core提供的:特定于环境的配置。为此,您需要运行两个不同的应用程序,但安装程序仍然可以在同一个项目中,您只需更改环境变量

为此,您首先需要一个带有设置的
launchSettings.json

文档中的示例

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNET_ENV": "Development"
      }
    },
    "web": {
      "commandName": "web",
      "environmentVariables": {
        "Hosting:Environment": "Staging"
      }
    }
  }
}
此处,环境设置为“暂存”。接下来,您需要为它定义一个配置

using Microsoft.AspNet.Builder;

namespace Environments
{
    public class StartupStaging
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseWelcomePage();
        }
    }
}

namespace Environments
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseWelcomePage();
        }
    }
}
现在,当您的环境设置为
Production
时,将调用
Startup
类(如果存在
StartupProduction
)。如果您的环境变量设置为
Staging
,则将调用
StartupStaging

至于不同的URL。。。在生产应用程序中,将其设置为

"iisExpress": {
  "applicationUrl": "http://example.com/",
  "sslPort": 0
}
以及您的测试环境

"iisExpress": {
  "applicationUrl": "http://example.com/Test/",
  "sslPort": 0
}
代码/配置片段取自。或者只需为不同的环境使用
hosting.json

hosting.json

{
  "server": "Microsoft.AspNet.Server.Kestrel",
  "server.urls": "http://example.com/"
}

在我看来,你也可以有多个名为hosting.production.json等的文件。

我不建议你这样做,你只会让你的工作更难

而是使用ASP.NET Core提供的:特定于环境的配置。为此,您需要运行两个不同的应用程序,但安装程序仍然可以在同一个项目中,您只需更改环境变量

为此,您首先需要一个带有设置的
launchSettings.json

文档中的示例

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNET_ENV": "Development"
      }
    },
    "web": {
      "commandName": "web",
      "environmentVariables": {
        "Hosting:Environment": "Staging"
      }
    }
  }
}
此处,环境设置为“暂存”。接下来,您需要为它定义一个配置

using Microsoft.AspNet.Builder;

namespace Environments
{
    public class StartupStaging
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseWelcomePage();
        }
    }
}

namespace Environments
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseWelcomePage();
        }
    }
}
现在,当您的环境设置为
Production
时,将调用
Startup
类(如果存在
StartupProduction
)。如果您的环境变量设置为
Staging
,则将调用
StartupStaging

至于不同的URL。。。在生产应用程序中,将其设置为

"iisExpress": {
  "applicationUrl": "http://example.com/",
  "sslPort": 0
}
以及您的测试环境

"iisExpress": {
  "applicationUrl": "http://example.com/Test/",
  "sslPort": 0
}
代码/配置片段取自。或者只需为不同的环境使用
hosting.json

hosting.json

{
  "server": "Microsoft.AspNet.Server.Kestrel",
  "server.urls": "http://example.com/"
}

在我的脑海中,我认为您还可以有多个名为hosting.production.json等的文件。

您可能可以为您的
/Test
路由创建第二个
服务集合。但是,不确定是否可以为子路径自动注入。您可能可以为您的
/Test
路由创建第二个
ServiceCollection
。但不确定是否有可能为子路径自动注入。