この質問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の専門家ではありませんが、試しています...