2017-12-28 8 views
0

zu aktivieren, nicht aufgelöst werden. Ich weiß, dass es viele Fragen und Informationen im Internet über dieses Problem gibt. Aber auf der Suche nach 4-5 Stunden konnte ich die Sache nicht lösen. Suche nach direkter oder indirekter Hilfe/Richtung.InvalidOperationException: Service für den Typ 'YYY.ILogDataAccess' konnte beim Versuch, 'XXX.CustomExceptionFilter

Ich verwende: VS 2017 ASP .Net-Core 2,0

Sag mal, ich habe 3 Projekte in einer Lösung.

  1. Data Access (Interaktion mit Datenbank)
  2. Protokollierung (in mehreren Weise log)
  3. Api (oder Service)

In meinem Api gibt ein CustomExceptionFilter von IExceptionFilter ist. Ich behandle alle Ausnahmen von OnException().

Ich muss Log in OnException erstellen. Und um zu loggen, muss ich auf DB zugreifen.

Zu diesem Zweck in Startup.cs, ConfigureServices(), Ich injecte die Abhängigkeit von CustomExceptionFilter, wie es LoggingWrapper in OnException() Verfahren benötigen. Hier

ist der Code:

services.AddSingleton<IExceptionFilter>(
new CustomExceptionFilter(
new LogDataAccess(
appServiceConfig.ConnectionString, appServiceConfig.Database))); 

Hier LogDataAccess ist die Klasse, melden Sie sich in die Datenbank einzufügen.

Und ich habe einen Konstruktor in CustomExceptionFilter Klasse wie overrided:

private ILogDataAccess logDataAccess; 

public CustomExceptionFilter(ILogDataAccess logDataAccess) 
{ 
    this.logDataAccess = logDataAccess; 
} 

das Projekt Gebäude ist in Ordnung. Während ich laufe, startup.cs führt bis jetzt gut aus. logDataAccess ist schön instanziiert. Nach dem Abschluss anderer Anweisungen in Startup.cs, wenn es versucht, aus "program.cs" Haupteingangspunkt zu kommen, zeigt Es zeigt den Fehler:

Hier ist die Stacktrace von Fehler.

System.InvalidOperationException: Unable to resolve service for type 'DataAccess.ILogDataAccess' while attempting to activate 'QuestionService.Common.CustomExceptionFilter'. 

    at Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired) 

    at lambda_method(Closure , IServiceProvider , Object[]) 

    at Microsoft.AspNetCore.Mvc.TypeFilterAttribute.CreateInstance(IServiceProvider serviceProvider) 

    at Microsoft.AspNetCore.Mvc.Internal.DefaultFilterProvider.ProvideFilter(FilterProviderContext context, FilterItem filterItem) 

    at Microsoft.AspNetCore.Mvc.Internal.DefaultFilterProvider.OnProvidersExecuting(FilterProviderContext context) 

    at Microsoft.AspNetCore.Mvc.Internal.FilterFactory.CreateUncachedFiltersCore(IFilterProvider[] filterProviders, ActionContext actionContext, List`1 filterItems) 

    at Microsoft.AspNetCore.Mvc.Internal.FilterFactory.GetAllFilters(IFilterProvider[] filterProviders, ActionContext actionContext) 

    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvokerCache.GetCachedResult(ControllerContext controllerContext) 

    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvokerProvider.OnProvidersExecuting(ActionInvokerProviderContext context) 

    at Microsoft.AspNetCore.Mvc.Internal.ActionInvokerFactory.CreateInvoker(ActionContext actionContext) 

    at Microsoft.AspNetCore.Mvc.Internal.MvcAttributeRouteHandler.<>c__DisplayClass12_0.<RouteAsync>b__0(HttpContext c) 

    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() 

--- End of stack trace from previous location where exception was thrown --- 

    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 

    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 

    at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext() 

--- End of stack trace from previous location where exception was thrown --- 

    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 

    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 

    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.<Invoke>d__6.MoveNext() 

--- End of stack trace from previous location where exception was thrown --- 

    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 

    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 

    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() 

Ich habe ConfigureServices() wie dies auch CustomExceptionFilter in der gleichen Methode hinzugefügt.

services.AddMvc(
      config => 
      { 
       config.Filters.Add(typeof(CustomExceptionFilter)); 
      } 
     ); 

Dies wird für globale Ausnahmefilter hinzugefügt.

+0

es scheint, wie Abhängigkeitsproblem haben Sie registriert Ihre 'ILogDataAccess' in' ConfigureServices() '' startup.cs'?etwas wie 'services.AddScoped ();' – Curiousdev

+0

Was ich bis jetzt gefunden habe, ist der Fehler wegen des Konstruktors von 'CustomExceptionFilter'. –

Antwort

0

Sie müssen LogDataAccess anstelle von CustomExceptionFilter in DI registrieren.

Änderung:

services.AddSingleton<IExceptionFilter>(new CustomExceptionFilter(new LogDataAccess(
    appServiceConfig.ConnectionString, appServiceConfig.Database))); 

zu:

services.AddSingleton<ILogDataAccess>(new LogDataAccess(
    appServiceConfig.ConnectionString, appServiceConfig.Database)); 
Verwandte Themen