【发布时间】:2018-12-03 19:07:10
【问题描述】:
“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-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 的世界。一切都很顺利。但我最终遇到了需要开发友好型混凝土与非开发型“真实”混凝土的情况。
“Microsoft.Extensions.DependencyInjection”无法使用 Xml(据我所知)。
我不确定 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 too
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>()
追加
这篇文章和片段帮助我更好地理解“内置内容”部分:
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") )是我猜的技巧。
追加:
这个 SOF 问题让 Asp.Net Core 更清楚了。
How to set aspnetcore_environment in publish file?
以及无需实际设置(机器)环境变量即可设置环境变量的方法!
【问题讨论】:
-
好的,我去看看。看起来他们有 3 个“预定义”环境,但可以添加自定义环境。 IsDevelopment(IHostingEnvironment) IsProduction(IHostingEnvironment) IsStaging(IHostingEnvironment) IsEnvironment(IHostingEnvironment, String)
-
我认为您在第三段中的句子“例如,如果我的 webApi ....”中缺少某些内容。你能仔细检查那句话吗?
标签: c# dependency-injection .net-core microsoft.extensions.hosting