2016-10-02 6 views
0

Ich habe meine Abhängigkeitsinjektion unter Verwendung SimpleInjector in der gleichen Weise wie vorgestellt here eingerichtet. Leider löst eine Ausnahme RegisterMvcViewComponents auf dem Container-Objekt aufrufen:Wie IViewComponentDescriptorProvider in .NET Core registrieren?

Kein Service für Typ ‚Microsoft.AspNetCore.Mvc.ViewComponents.IViewComponentDescriptorProvider‘ wurde registriert.

Hat der Container eine entsprechende Methode zur Registrierung des Anbieters? Oder sollte es anders gemacht werden?

Der Code:

public class Startup 
{ 
    private Container _container = new Container(); 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.InitializeTestData(); 

     services.AddMvcCore(); 

     services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(_container)); 
     services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(_container));   
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     app.UseSimpleInjectorAspNetRequestScoping(_container); 
     _container.Options.DefaultScopedLifestyle = new AspNetRequestLifestyle(); 
     InitializeContainer(app); 
     _container.Verify(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
     } 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "Default", 
       template: "{controller=Home}/{action=Index}/{id?}" 
      ); 
     }); 
    } 

    private void InitializeContainer(IApplicationBuilder app) 
    { 
     _container.RegisterMvcControllers(app); 
     _container.RegisterMvcViewComponents(app); 

     _container.Register<IDbContext>(() => new DbContext("GuitarProject")); 
     _container.Register<IJournalEntryRepository, JournalEntryRepository>(); 
    } 
} 

Stack-Trace (die Art der Ausnahme ist InvalidOperationException):

bei Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (IServiceProvider Anbieter, Typ Servicetype) um Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T] (IServiceProvider Provider) um SimpleInjector.SimpleInjectorAspNetCoreMvcIntegrationExtensions.RegisterMvcViewComponents (Container Behälter, IApplicationBuilder Application) bei ProjectX.Startup.InitializeContainer (IApplicationBuilder app)

+0

Können Sie den kompletten Stack Trace veröffentlichen? – Steven

+0

@Steven Stack-Trace hinzugefügt. – Kapol

Antwort

1

Ändern der folgenden Zeile:

services.AddMvcCore(); 

To:

services.AddMvc(); 

Einfache Injektor RegisterMvcViewComponent metho d erfordert, dass die Abstraktion IViewComponentDescriptorProvider im ASP.NET Core-Konfigurationssystem registriert wird. Die Erweiterungsmethode verwendet die IViewComponentDescriptorProvider, um herauszufinden, welche Ansichtskomponenten registriert werden müssen. Die von Ihnen aufgerufene Erweiterungsmethoderegistriert dies jedoch nicht IViewComponentDescriptorProvider, da die Methode AddMvcCore nur einige grundlegende Funktionen registriert; es lässt bestimmte Dinge aus. Die Erweiterungsmethode AddMvc() dagegen initialisiert das gesamte Paket inklusive View-Related-Stuff wie zB IViewComponentDescriptorProvider.

Wenn Sie nicht an Ansichtskomponenten interessiert sind, können Sie auch den Anruf an RegisterMvcViewComponents() weglassen.

+0

Ihre Lösung behebt das Problem. Ich habe gerade angefangen, .NET Core zu lernen, also wusste ich nicht wirklich, was ich tat, als ich das MVC Core-Paket installierte, anstatt das, das ich benötigte :-) – Kapol

+0

@Kapol Ich habe gerade eine Verbesserung im Integrationspaket gemacht. Die nächste Version wird eine Ausnahme mit einer Messah werfen, die das Problem besser erklären wird und wie dieses Problem gelöst werden kann. – Steven