2016-11-25 5 views
1

Ich möchte einige Abhängigkeiten bei einer TagHelper lösen, und ich habe gelesen here, dass ich die ITagHelperActivator Schnittstelle registrieren muss.Registrierung von ITagHelperActivator bei Simple Injector in ASP.NET Core MVC App

Ich habe versucht, dass mit dem folgenden Code:

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

Aber ich erhalte den folgenden Fehler:

ActivationException: The constructor of type UrlResolutionTagHelper contains the parameter with name 'urlHelperFactory' and type IUrlHelperFactory that is not registered. Please ensure IUrlHelperFactory is registered, or change the constructor of UrlResolutionTagHelper.

Als ich IUrlHelperFactory registrieren UrlHelperFactory dann eine andere Abhängigkeit fehlt, und ich erhalte eine Fehlermeldung auch dafür.

Ich denke, ich mache etwas falsch, ich möchte nicht das komplette Framework registrieren.

+0

Haben Sie versucht, services.AddMvc in ConfigureServices Methode hinzufügen –

Antwort

1

Dies wird nicht funktionieren. Durch Ersetzen des Standard-Tag-Helfer-Aktivators haben Sie die Auflösung von alle-Tag-Helfer zu Simple Injector umgeleitet, aber es gibt eingebaute Tag-Helfer, die den eingebauten Container benötigen, um aufgelöst zu werden.

Stattdessen v3.3 des SimpleInjector.Integration.AspNetCore.Mvc NuGet Paket ermöglicht es Ihnen, ein benutzerdefiniertes Tag Helfer-Aktivator mit der AddSimpleInjectorTagHelperActivation Extension-Methode registrieren Sie wie folgt vor:

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

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

Die Erweiterung Methode kümmert sich um die Filterung von Tag-Helfer. Wenn sich ein angeforderter Tag-Helfer in einer Assembly befindet, die mit "Microsoft" beginnt, wird die Anforderung für den Tag-Helfer an den integrierten Tag-Helfer-Aktivator weitergeleitet. Andernfalls wird das mitgelieferte container aufgefordert, den Typ zu erstellen.

Sie können dieses Standardverhalten außer Kraft setzen, indem Sie eine benutzerdefinierte Prädikat zum AddSimpleInjectorTagHelperActivation Methode liefert:

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

Anwendung das Prädikat erforderlich wird, wenn Sie 3rd-Party-Bibliotheken beginnen, die ihre eigenen Tag-Helfer-Plug-in. In diesem Fall schlägt der Standardfilter für Tags im Namespace "Microsoft" fehl.

Alternativ können Sie auch direkt die SimpleInjectorTagHelperActivator verwenden, beachten Sie jedoch, dass dies komplizierter zu registrieren ist. Sie sollten in der Regel die AddSimpleInjectorTagHelperActivation Erweiterungsmethode verwenden statt:

services.AddSingleton<ITagHelperActivator>(p => 
    new SimpleInjectorTagHelperActivator(
     container, 
     type => type.Namespace.StartsWith("MyApplication"), 
     new DefaultTagHelperActivator(p.GetService<ITypeActivatorCache>()))); 
+0

Danke, werde ich das morgen überprüfen. Es ist nicht direkt mit zwei DI-Frameworks im selben Projekt. Ist das Problem des SimpleInjector oder jedes DI hat die gleichen Probleme? –

+0

Dies ist absolut kein einfaches Injektor Problem. Sie sehen dies mit allen Containern und wir hatten diese Probleme zuvor nie mit der alten ASP.NET-Plattform. Dies wird durch einen Konstruktionsfehler in ASP.NET Core verursacht. – Steven

+1

@MenelaosVergis: Wir haben eine verbesserte Version unserer Integrationsbibliothek I veröffentlicht und die Antwort entsprechend aktualisiert. – Steven

Verwandte Themen