在ASP.NET Core MVC应用程序中的Simple Injector中注册ITagHelperActivator

时间:2016-11-25 16:28:38

标签: c# asp.net-core simple-injector tag-helpers

我想在TagHelper解析一些依赖项,我已阅读here我必须注册ITagHelperActivator接口。

我尝试使用以下代码:

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

但是我收到以下错误:

  

ActivationException:UrlResolutionTagHelper类型的构造函数   包含名为'urlHelperFactory'的参数并输入   IUrlHelperFactory未注册。请确保   IUrlHelperFactory已注册,或更改构造函数   UrlResolutionTagHelper。

当我使用IUrlHelperFactory注册UrlHelperFactory时,其他依赖项缺失,我也会收到错误。

我想我做错了什么,我不想注册完整的框架。

1 个答案:

答案 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>())));
相关问题