我想在TagHelper
解析一些依赖项,我已阅读here我必须注册ITagHelperActivator
接口。
我尝试使用以下代码:
services.AddSingleton<ITagHelperActivator>(new SimpleInjectorTagHelperActivator(container))
但是我收到以下错误:
ActivationException:UrlResolutionTagHelper类型的构造函数 包含名为'urlHelperFactory'的参数并输入 IUrlHelperFactory未注册。请确保 IUrlHelperFactory已注册,或更改构造函数 UrlResolutionTagHelper。
当我使用IUrlHelperFactory
注册UrlHelperFactory
时,其他依赖项缺失,我也会收到错误。
我想我做错了什么,我不想注册完整的框架。
答案 0 :(得分:1)
这不起作用。通过替换默认标记助手激活器,您将所有标记助手的分辨率重定向到Simple Injector,但是有内置标记助手,它们需要解析内置容器。
相反,SimpleInjector.Integration.AspNetCore.Mvc NuGet包的v3.3允许您使用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>())));