1

この質問Ninject Dependency Injection in MVC3 - Outside of a Controllerは、私が経験しているものに近いですが、完全ではありません。

Ninject 3 を使用する ASP.NET MVC3 サイトがあり、コンストラクター インジェクションでうまく機能します。HttpContext.Current で渡されるものを含め、すべての依存関係が解決されます。

私の問題は、global.asax で、タイマーで定期的にいくつかのタスクを実行する TaskManager クラスを開始することです。TaskManager クラス内にはコントローラーがないため、依存関係の 1 つ (エラー ログ サービスなど) にアクセスする必要がある場合は、カーネル オブジェクトにアクセスできる静的ラッパー クラスを使用します。

var logger = MyContainer.Get<ILoggingService>();
logger.Error("error doing something...", ex);

.Get メソッドは、kernel.Get 呼び出しを実行するだけで依存関係を解決します。他の依存関係でこのメソッドを使用するたびにうまく機能します。ただし、ILoggingService には MyWebHelper という依存関係があり、コンストラクターを介して注入され、コンストラクターに HttpContext が含まれています。

    public class DefaultLogger : ILoggingService
    {     
        public DefaultLogger(IRepository<Log> logRepository, IWebHelper webHelper)
        {
            _logRepository = logRepository;
            _webHelper = webHelper;
       }
    }

    public class MyWebHelper : IWebHelper
    {
      public MyWebHelper(HttpContext httpContext)
      {
          _httpContext = httpContext;
      }
    }

私の Web サイトの残りの部分では、すべての依存関係が MVC コントローラーに注入されるため、これはすべて正常に機能します。しかし、静的ラッパー クラスを手動で呼び出して依存関係を取得するとうまくいきません。エラーが発生します:

HttpContext からメソッドへのバインディングを使用して HttpContext をアクティブ化中にエラーが発生しました

プロバイダーが null を返しました。

したがって、MVC アプリケーションの残りの部分で行うように HttpContext を提供するわけではありません。これが理にかなっていることを願っています。私はまだninjectの専門家ではありませんが、試しています...

4

1 に答える 1

3

私の問題は、global.asax で、タイマーで定期的にいくつかのタスクを実行する TaskManager クラスを開始することです。

Phil Haackが詳細に説明しているように、それは悪い考えです。Web アプリケーションではこれを行わないでください。これらの定期的なタスクは、別のアプリケーション (Windows サービスまたは定期的に実行されるようにスケジュールされているコンソール アプリケーション) で実行する必要があります。

ここで重要なのは、バックグラウンド スレッドを実行していることです。これらのバックグラウンド スレッドは、ユーザーの HTTP リクエストの外部で実行されるため、HttpContext.Current内部では明らかに null になります。したがって、Phil Haack のアドバイスに従わず、ASP.NET アプリケーションでバックグラウンド タスクを実行し続ける場合でも、メソッドを再構築して、HttpContext に依存しないようにする必要があります。これらのバックグラウンド スレッドにはそのようなものがないためです。

于 2012-06-13T06:23:45.243 に答える