我有一个 Blazor 服务器端应用程序。
在
program.cs
中,我检查应用程序是否正在开发、生产或暂存中运行。
if (builder.Environment.IsDevelopment())
{
Console.WriteLine("##### Running in Development ####");
}
if (builder.Environment.IsProduction())
{
Console.WriteLine("##### Running in Production ####");
}
if (builder.Environment.IsStaging())
{
Console.WriteLine("##### Running in Staging ####");
}
我想在我的
MainLayout.razor
中展示这个。
我将如何处理这个问题?我可以以某种方式解析它还是可以通过服务以某种方式访问
builder
?
我会使用预处理器指令:
#if DEBUG
Console.WriteLine("Debug version");
#else
Console.Writeline("Prod");
#endif
你几乎可以在程序的任何地方使用它。特别是在你的 blazor 应用程序的情况下,不确定你想在这些条件下做什么,但例如你可以在开发中显示一个组件或文本块,并在发布中显示一个不同的组件。
使用预处理器指令的一个优点是您不会在生产中遇到所有不必要的条件和额外的不适用代码行。您的代码发布版本将仅包含上面 else 语句下的内容。
我的一个提示是,您应该将构建模式更改为“发布”,并确保它在提交或执行拉取请求之前使用您的“其他”条件进行编译。我犯了这个错误,你最终只编译了调试版本的代码,一切都检查出来了,但编译时警告不会出现在其他情况下,除非你在那种模式下构建.
这是一个链接,您可以在其中阅读有关指令如何工作的所有详细信息:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives
可以在此处以及其他地方找到使用处理器指令与环境检查的优缺点。 #if DEBUG 与 if (env.IsDevelopment())
编辑:还想添加一个可能不明显的提示,例如,您可以将自己的常量定义为 msbuild 字符串中的参数。
/p:DefineConstants="STAGING;OTHERSTUFF"
通过这种方式,您可以将预处理器指令查询扩展到库存常量之外,这在您构建和部署到每个环境时可能更有用。例如,如果您同时为阶段和生产构建发布版本,则为构建/部署过程定义您自己的常量(例如在您的 devops ci/cd 管道中)可以让您对指令进行更细粒度的控制。
我将如何处理这个问题?我可以以某种方式解析它还是可以访问 建筑商以某种方式通过服务?
其实。如果您想显示您的应用程序环境状态,那么可以通过多种方式实现。您可以创建一个静态类然后传递值然后可以访问应用程序中的任何地方或创建扩展方法甚至直接访问EnvironmentVariable
让我们实际看看:
使用静态类;
public static class GetEnvironmntInfo
{
public static string? Info { get; set; }
}
在静态属性中绑定环境信息:
if (builder.Environment.IsProduction())
{
GetEnvironmntInfo.Info = "#### Running In Production ####";
}
if (builder.Environment.IsDevelopment())
{
GetEnvironmntInfo.Info = "#### Running In Development ####";
}
if (builder.Environment.IsStaging())
{
GetEnvironmntInfo.Info = "#### Running In Staging ####";
}
在 MainLayout.razor 中访问:
<div>
<h1>Way:1</h1>
@{
<strong>@GetEnvironmntInfo.Info</strong>
}
</div>
输出:
ASPNETCORE_ENVIRONMENT
信息:
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
现在,您也可以设置条件了。
我创建了一个环境服务:
public class EnvironmentService
{
private readonly IWebHostEnvironment _environment;
public EnvironmentService(IWebHostEnvironment environment)
{
_environment = environment;
}
public string GetEnvironment()
{
if (_environment.IsDevelopment())
{
return "Development";
}
else if (_environment.IsProduction())
{
return "Production";
}
else if (_environment.IsStaging())
{
return "Staging";
}
else
{
return "Unknown";
}
}
}
将其添加到我的 program.cs:
builder.Services.AddScoped<EnvironmentService>();
可以在我的 MainLayout.razor 中使用它并注入它:
@inject EnvironmentService EnvironmentService
<p>@EnvironmentService.GetEnvironment()</p>