Регистрация 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>())));