2017-12-28 21 views
0

この問題に関するインターネットに関する多くの質問と情報があります。しかし、4〜5時間を探して、私はその問題を解決することができませんでした。直接的または間接的なヘルプ/方向を探しています。私が使用していますInvalidOperationException: 'XXX.CustomExceptionFilterをアクティブにしようとしているときに、' YYY.ILogDataAccess 'タイプのサービスを解決できません。

:VS 2017 ASP。ネットコア2.0

言ってやるが、私は、溶液中の3つのプロジェクトを持っています。

  1. DATAACCESS(データベースと対話)
  2. (いくつかの方法でログインするには)ログイン私のAPIで
  3. API(またはサービス)

IExceptionFilterからCustomExceptionFilterがあります。私はOnException()からすべての例外を処理しています。

ログ内部にOnExceptionを作成する必要があります。ログには、DBにアクセスする必要があります。それはOnException()方法でLoggingWrapperが必要になりますように、その目的のために

は、Startup.csConfigureServices()に、私は、CustomExceptionFilterの依存関係を注入しています。ここで

は、コードは次のとおりです。ここで

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

LogDataAccessは、データベースにログイン挿入するクラスです。

そして、私のようなCustomExceptionFilterクラスのコンストラクタをオーバーライドしている:プロジェクトのビルド

private ILogDataAccess logDataAccess; 

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

は大丈夫です。私が走っている間、startup.csはそれまでのところうまく実行されます。 logDataAccessはうまくインスタンス化されます。 Startup.csの他のステートメントを完了した後、 "program.cs"のメインエントリポイント が表示されます。

エラーのスタックトレースが表示されます。

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() 

私も、このように同じ方法でCustomExceptionFilterConfigureServices() を追加しました。

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

グローバル例外フィルタに追加されます。

+0

それはあなたが() '' 'startup.cs' ConfigureServicesであなたの' ILogDataAccess'を登録した依存関係の問題のように思えますか?'services.AddScoped ();' – Curiousdev

+0

のようなものです。これは、 'CustomExceptionFilter'のコンストラクタのせいでエラーが表示されています。 –

答えて

0

DIにCustomExceptionFilterの代わりにLogDataAccessを登録する必要があります。

変更:

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

には:

services.AddSingleton<ILogDataAccess>(new LogDataAccess(
    appServiceConfig.ConnectionString, appServiceConfig.Database)); 
関連する問題