【问题标题】:AspNet Core Route Mapping with different Dependency Injection具有不同依赖注入的 AspNet Core 路由映射
【发布时间】:2016-07-03 00:31:58
【问题描述】:

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

【问题讨论】:

  • 您可能会为您的/Test 路由创建第二个ServiceCollection。不确定是否可以为子路径自动注入它。

标签: c# dependency-injection asp.net-core


【解决方案1】:

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

而是使用 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
}

代码/配置片段取自ASP.NET Core Docs。或者只是将hosting.json 用于不同的环境。

hosting.json

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2018-06-17
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多