是否可以在 HTML 辅助方法中确定 ASP.NET 核心托管环境?

Is it possible to determine the ASP.NET Core hosting environment in an HTML helper method?

我正在 ASP.NET Core 中编写一个 HTML 辅助方法,我想检测当前的托管环境。给定的方法是使用 DI,例如:

public class MyClass {
    private readonly IHostingEnvironment _hostingEnvironment;

    public MyClass(IHostingEnvironment hostingEnvironment) {
        _hostingEnvironment = hostingEnvironment;
    }

    public void Xyzzy() {
        var environment = _hostingEnvironment.EnvironmentName;
        [...]
    }
}

但是 HTML 辅助方法是扩展方法,因此必须是静态的,因此不能使用 DI。我似乎在 IHtmlHelper 对象中看不到任何告诉我当前托管环境的信息;如何从我的 HTML 辅助方法中找到它?

IHtmlHelper 有一个 ViewContext property, which itself has a HttpContext property. With this, you can use GetRequiredService 得到 IHostingEnvironment。这是一个例子:

htmlHelper.ViewContext.HttpContext.RequestServices
    .GetRequiredService<IHostingEnvironment>();

这不是 DI:它使用服务定位器模式,通常称为 antipattern. If you want to use DI, consider creating a Tag Helper 而不是 IHtmlHelper 扩展方法。这也将减少嵌套所有这些 属性 访问调用的需要。