代码之家  ›  专栏  ›  技术社区  ›  granadaCoder

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

  •  0
  • granadaCoder  · 技术社区  · 6 年前

    “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-your-unity-xml-configuration/

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

    IAuthorizer
    
    MyRealAuthorizer : IAuthorizer
    
    MyDevLetEverythingThroughAuthorizer : IAuthorizer
    

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

    我的构建过程会改变团结。xml(确切地说是unity.config)和change out(通过msbuild中的xml更新任务)

    我的开发者通过授权人

    我的授权人

    .

    .....

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

    import org.springframework.context.annotation.Profile;
    
    
    @Profile("localdev")
    public class MyDevLetEverythingThroughAuthorizer implements IAuthorizer {
    
    
    @Profile("!localdev")
    public class MyRealAuthorizer implements IAuthorizer {
    

    但这并不符合“复合根”模式:(马克·西曼) http://blog.ploeh.dk/2011/07/28/CompositionRoot/ )

    .......

    现在我进入了DotNetCore的世界。一切都很顺利。但我最终遇到了一个情况,我需要一个开发友好的混凝土,而不是一个非开发“真正”的混凝土。

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

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

    基本上,下面。。。。。。但是尊重环境。

    asp。净的

        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)点。净核心也一样

        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核心读取环境变量 ASPNETCORE_环境,并将价值存储在 我喜欢这里的环境。环境名称。你可以设定 ASPNETCORE_环境支持任何值,但 框架:开发、分期和生产。如果 未设置ASPNETCORE_环境,默认为生产环境。

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

    这个

    环境。iEnvironment(“Staging_2”)(类似于env.iEnvironment(“MyCustomValue”))是我猜的诀窍。

    附加:

    这个问题让Asp更清楚了。净核心。

    How to set aspnetcore_environment in publish file?

    以及在不实际设置(机器)环境变量的情况下设置环境变量的方法!

    2 回复  |  直到 6 年前
        1
  •  1
  •   amiry jd    6 年前
    public void ConfigureServices(IServiceCollection services, IHostingEnvironment environment) {
            if (environment.IsDevelopment()) {
                // bla bla bla
            } else {
                // bla bla bla
            }
            // register no-matter-which-environment services
    }
    
        2
  •  0
  •   Neville Nazerane    6 年前

    您的问题似乎涉及两件事:从XML文件设置配置和使用XML文件管理服务 IServiceCollection 对于net核心web应用程序,分两个阶段进行:

    1. 键值对是从各种预定义和自定义源(包括json、XML和环境)整合而成的。全部预设。net核心web模板在程序中实现了这一点。反恐精英。

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

    在这个过程中,所有配置文件都会添加到 ConfigureServices 方法在 启动 班如果要将XML文件添加到此配置中,可以在程序中设置以下代码。反恐精英:

    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,但您始终可以注入 I配置 如果需要的话,这是最简单的解决方案。但是,我建议不要将您的整个配置公开给您的服务,并在 this documentation