首页 > 解决方案 > “Microsoft.Extensions.DependencyInjection”和每个环境的不同具体

问题描述

“Microsoft.Extensions.DependencyInjection”

List of "environments"
  Production
  Uat
  Qa
  DevShared
  LocalDev

使用 DotNet (Framework/Classic) 4.6 或更高版本(又名“过去”,我使用带有 xml 配置的“Unity” 。https://blogs.msdn.microsoft.com/miah/2009/04/03/testing-你的统一xml配置/

(过去在使用“Unity”IoC/DI 的 Dot Net 核心之前)...当我需要一个特定于环境的混凝土时,我会调整 .xml 上的混凝土。例如,假设我的 webApi 需要在生产、uat、qa 和 dev-shared 中进行身份验证。但是在 dev-local 中,我不想在开发 webApi 时一直处理身份验证,我会有 2 个具体的。

IAuthorizer

MyRealAuthorizer : IAuthorizer

MyDevLetEverythingThroughAuthorizer : IAuthorizer

我会“注册”其中一个..使用xml。

我的构建过程将更改 unity.xml(准确地说是 unity.config)并更改(通过 msbuild 中的 xml-update-tasks)

MyDevLetEverythingThroughAuthorizer

MyRealAuthorizer

.

......

Java Spring具有基于“注释”的:

import org.springframework.context.annotation.Profile;


@Profile("localdev")
public class MyDevLetEverythingThroughAuthorizer implements IAuthorizer {


@Profile("!localdev")
public class MyRealAuthorizer implements IAuthorizer {

但这不尊重“复合根”模式:(Mark Seeman http://blog.ploeh.dk/2011/07/28/CompositionRoot/

…………

所以现在我进入了 DotNetCore 的世界。一切都很顺利。但我终于遇到了一个需要开发友好的混凝土与非开发“真实”混凝土的情况。

Xml 不可用(据我所知)“Microsoft.Extensions.DependencyInjection”。

在这种情况下,我不确定 DotNetCore 的最佳实践。

我更愿意尊重复合根模式。

基本上,以下......但尊重环境。

asp.net'ish

    public void ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        /* need this for "local-dev" */
        services.AddScoped<IAuthorizer, MyDevLetEverythingThroughAuthorizer>();

        /* need this for everything EXCEPT "local-dev" */
        services.AddScoped<IAuthorizer, MyRealAuthorizer>();

    }

(不是 asp.net)dot.net core'ish 太

    private static System.IServiceProvider BuildDi()
    {
        //setup our DI
        IServiceProvider serviceProvider = new ServiceCollection()
            .AddLogging()
            /* need this for "local-dev" */
            .AddSingleton<IAuthorizer, MyDevLetEverythingThroughAuthorizer>()

            /* need this for everything EXCEPT "local-dev" */
            .AddSingleton<IAuthorizer, MyRealAuthorizer>()              

附加

这篇文章和 snipplet 帮助我更好地理解“内置内容”部分:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2

环境 ASP.NET Core 在应用启动时读取环境变量 ASPNETCORE_ENVIRONMENT 并将值存储在 IHostingEnvironment.EnvironmentName 中。您可以将 ASPNETCORE_ENVIRONMENT 设置为任何值,但框架支持三个值:Development、Staging 和 Production。如果未设置 ASPNETCORE_ENVIRONMENT,则默认为生产。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();
}

env.IsEnvironment("Staging_2") (类似于 env.IsEnvironment("MyCustomValue") )是我猜的技巧。

附加:

这个 SOF 问题让 Asp.Net Core 更加清晰。

如何在发布文件中设置 aspnetcore_environment?

以及无需实际设置(机器)环境变量即可设置环境变量的方法!

标签: c#dependency-injection.net-coremicrosoft.extensions.hosting

解决方案


public void ConfigureServices(IServiceCollection services, IHostingEnvironment environment) {
        if (environment.IsDevelopment()) {
            // bla bla bla
        } else {
            // bla bla bla
        }
        // register no-matter-which-environment services
}

推荐阅读