"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应用程序,这些操作分为两个阶段:
-
键值对是从各种预定义和自定义源(包括json、XML、环境(合并而来的。所有预设的.net核心网页模板都在程序.cs.中执行此操作
-
键值对集合被发送到
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
作为最简单的解决方案。但是,我建议不要将您的整个配置暴露在您的服务中,并在本文档的帮助下查看设置选项