【问题标题】:HtmlHelper in .NET Core 2.0 with appsettings being injected in.NET Core 2.0 中的 HtmlHelper,其中注入了 appsettings
【发布时间】:2019-11-04 15:36:03
【问题描述】:

我可能走上了死胡同,所以我希望有人能告诉我“转身!”或“继续前进!” - 我正在尝试将 HTML 帮助程序从 ASP.NET 5 应用程序转换为 .NET Core 2.0 应用程序。在扩展类中调用助手时遇到了麻烦。首先,我读到 .NET Core 使用 DI 将 appsettings 放入单独的类中,因此我使用 DI 设置了扩展类:

private readonly AppSettings _appsettings;

public HtmlHelperExtensions2(IOptions<AppSettings> appSettings)
{
    _appsettings = appSettings.Value;
}

而且我可以从 appSettings.json 返回项目。问题是要使用 DI,我需要从类签名中删除“静态”引用,所以我还必须从帮助程序调用中删除“this”引用:

public void HelpPanel(HtmlHelper htmlHelper, string thingId, string language)
{ }

否则会出现编译错误。但是没有“this”引用,调用需要一个新的 HtmlHelper。

所以我正在努力克服它,如果我真的可以克服它的话。这是正确的道路还是我在这里走上了死胡同?除了 HtmlHelpers 之外,我还需要在 Core 中使用其他东西吗?我无法确定它们是否在 Core 中得到支持。

【问题讨论】:

    标签: c# asp.net-core razor


    【解决方案1】:

    您可以从HtmlHelper 的实例访问请求的IServiceProvider,并使用Service Locator anti-pattern 解析来自DI 容器的实例。举个例子(这有点像“火车残骸”):

    var appSettings = htmlHelper.ViewContext.HttpContext.RequestServices
        .GetRequiredService<IOptions<AppSettings>>()
        .Value;
    

    免责声明:静态和服务定位器模式有点争议。 Tag Helpers 不使用静态并支持依赖注入,因此如果/当时间合适时,您可能需要考虑切换到其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 2018-05-02
      • 2018-03-03
      • 2018-10-31
      相关资源
      最近更新 更多