每个环境的"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-your-unity-xml-configuration/

(在过去使用"Unity"IoC/DI的Dot-Net核心之前(。。。当我需要一个特定于环境的具体内容时,我会调整.xml上的具体内容。例如,假设我的webApi在生产、uat、qa和dev共享中需要身份验证。但在dev-local中,我不想在开发webApi时一直处理身份验证,我会有两个具体的。

IAuthorizer
MyRealAuthorizer : IAuthorizer
MyDevLetEverythingThroughAuthorizer : IAuthorizer

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

我的构建过程将更改unity.xml(准确地说是unity.config(并更改(通过msbuild中的xml更新任务(

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 Seemanhttp://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>()              

附加

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

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

Environments 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"((是我想的诀窍。

附加:

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

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

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

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

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

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

  2. 键值对集合被发送到Startup类,该类可以通过来自IConfiguration变量的DI进行访问。有关详细信息,请查看此链接。

在此过程中,在Startup类中调用ConfigureServices方法之前,将添加所有配置文件。如果您想将XML文件添加到此配置中,您可以在程序中设置以下代码。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作为最简单的解决方案。但是,我建议不要将您的整个配置暴露在您的服务中,并在本文档的帮助下查看设置选项

最新更新