HtmlHelper в .NET Core 2.0 с настройками приложений, внедряемыми в - PullRequest
1 голос
/ 04 ноября 2019

Возможно, я нахожусь на тупиковом пути, поэтому я надеюсь, что кто-нибудь может сказать мне "развернись!"или "продолжай!"- Я пытаюсь преобразовать помощника HTML из приложения ASP.NET 5 в приложение .NET Core 2.0. Я столкнулся с проблемой при вызове помощника в классе расширения. Во-первых, я прочитал, что .NET Core использует DI для получения настроек приложений в отдельные классы, поэтому я установил класс расширения с помощью 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.

Так что я пытаюсь пройти через это, если я действительно могу пройти через это. Это правильный путь или я нахожусь в тупике? Нужно ли использовать в Core что-то еще, кроме HtmlHelpers? Я не могу определить, поддерживаются ли они даже в Core.

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете получить доступ к запросу IServiceProvider из экземпляра HtmlHelper и использовать Service Locator anti -pattern для разрешения экземпляров из контейнера DI. Приготовьтесь к примеру (это немного «крушение поезда»):

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

Отказ от ответственности: Статика и шаблон Service Locator немного спорны. Tag Helpers не используют статику и поддерживают внедрение зависимостей, поэтому вы можете рассмотреть возможность переключения на один из них, если / когда настало время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...