每个环境“ Microsoft.Extensions.DependencyInjection”和不同的具体方法

时间:2018-12-03 19:07:11

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

“ Microsoft.Extensions.DependencyInjection”

List of "environments"
  Production
  Uat
  Qa
  DevShared
  LocalDev

在DotNet(框架/经典)4.6或更高版本(又名“过去”)下,我将“ Unity”用于xml配置。https://blogs.msdn.microsoft.com/miah/2009/04/03/testing-your-unity-xml-configuration/

(过去在使用“ Unity” IoC / DI的Dot Net核心之前)...当我需要特定于环境的具体内容时,可以对.xml进行具体调整。 例如,假设我的webApi在生产,uat,qa和开发共享中需要身份验证。但是在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核心也是如此

    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>()              

APPEND

本文和摘录帮助我更好地理解“内置内容”部分:

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

  

环境ASP.NET Core读取环境变量   在应用启动时使用ASPNETCORE_ENVIRONMENT,并将值存储在   IHostingEnvironment.EnvironmentName。你可以设定   ASPNETCORE_ENVIRONMENT为任何值,但三个值受支持   框架:开发,登台和生产。如果   未设置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”))是我猜的把戏。

APPEND:

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

How to set aspnetcore_environment in publish file?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的问题似乎在谈论两件事:从XML文件设置配置和使用IServiceCollection管理服务。对于.net核心Web应用程序,这些过程分为两个阶段:

  1. 键值对是从各种预定义和自定义源(包括json,XML,环境)合并而成的。所有预设的.net核心Web模板都在program.cs中执行此操作。

  2. 键值对集合被发送到Startup类,该类可以通过DI从IConfiguration变量进行访问。检查this link了解更多信息。

在此过程中,将在ConfigureServices类中调用Startup方法之前添加所有配置文件。如果要将XML文件添加到此配置,可以在program.cs中设置以下代码:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    // additional code
        .UseConfiguration(
            new ConfigurationBuilder()
            .AddXmlFile("file.xml", true) // second param is if file is optional
            .Build()
        )
    // end of additional code
        .UseStartup<Startup>();

如果要访问环境,如果已将其设置为环境变量,则可以使用Environment.Get...函数之一。

关于您的服务,我不确定您尝试以哪种方式访问​​XML,但是如果需要,您始终可以将IConfiguration注入为最简单的解决方案。但是,我建议您不要将整个配置公开给您的服务,而应该借助this documentation

查看设置选项
相关问题