Регистрация ITagHelperActivator в Simple Injector в приложении ASP.NET Core MVC

Я хочу разрешить некоторые зависимости на TagHelper и я прочитал здесь, что я должен зарегистрировать ITagHelperActivator интерфейс.

Я попробовал это с помощью следующего кода:

services.AddSingleton<ITagHelperActivator>(new SimpleInjectorTagHelperActivator(container))

Но я получаю следующую ошибку:

ActivationException: конструктор типа UrlResolutionTagHelper содержит параметр с именем 'urlHelperFactory' и типом IUrlHelperFactory, который не зарегистрирован. Убедитесь, что IUrlHelperFactory зарегистрирован, или измените конструктор UrlResolutionTagHelper.

Когда я регистрируюсь IUrlHelperFactory с UrlHelperFactory тогда отсутствует другая зависимость, и я тоже получаю сообщение об ошибке.

Я предполагаю, что я делаю что-то не так, я не хочу регистрировать полную структуру.

1 ответ

Решение

Это не сработает. Заменив активатор помощников тегов по умолчанию, вы перенаправили разрешение всех помощников тегов на Simple Injector, но есть встроенные помощники тегов, и для них требуется разрешение встроенного контейнера.

Вместо этого v3.3 пакета https://www.nuget.org/packages/SimpleInjector.Integration.AspNetCore.Mvc NuGet позволяет зарегистрировать активатор вспомогательного тега с помощью AddSimpleInjectorTagHelperActivation метод расширения следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddSimpleInjectorTagHelperActivation(container);
    // rest of your configuration
}

Метод расширения заботится о фильтрации тегов-помощников. Когда запрашиваемый помощник по тегам находится в сборке, начинающейся с "Microsoft", запрос на помощник по тегам перенаправляется во встроенный активатор помощника по тегам. В противном случае поставляется container запрашивается для создания типа.

Вы можете переопределить это поведение по умолчанию, предоставив пользовательский предикат для AddSimpleInjectorTagHelperActivation метод:

services.AddSimpleInjectorTagHelperActivation(container,
    type => type.Namespace.StartsWith("MyApplication"));

Применение предиката становится необходимым, когда вы начинаете использовать сторонние библиотеки, которые подключают свои собственные помощники тегов. В этом случае фильтр по умолчанию для тегов в пространстве имен "Microsoft" не будет работать.

В качестве альтернативы вы также можете использовать SimpleInjectorTagHelperActivator напрямую, но обратите внимание, что это сложнее, чтобы зарегистрироваться правильно. Вы должны обычно использовать AddSimpleInjectorTagHelperActivation вместо этого метод расширения:

services.AddSingleton<ITagHelperActivator>(p =>
    new SimpleInjectorTagHelperActivator(
        container,
        type => type.Namespace.StartsWith("MyApplication"),
        new DefaultTagHelperActivator(p.GetService<ITypeActivatorCache>())));
Другие вопросы по тегам