8

私はDI用にNinjectとMVC4アプリ内のNinject.MVC3拡張機能、具体的にはバージョン3.0.0.6を使用しています。

Ninject の wikiのドキュメントを読むと、作成されたオブジェクトの有効期間InRequestScopeは実際には ASP.NET によって制御されており、適切にクリーンアップするにはOnePerRequestHttpModule を登録する必要があるようです。

しかし、このドコは古いようtype="Ninject.OnePerRequestModule"/>で見つからない。

一方、私は最近、すでに を扱っていることを示唆していると思われるビットをいくつか読みました。NinjectHttpApplicationOnePerRequest

私の質問は、Ninject.Web.MVC 3.0 が既にこの問題に対処しているのか、それとも HttpModule を「web.config」に手動で追加する必要があるのか​​ということです。

以下を構成に追加しましたが、すべてが機能しているように見えますが、オブジェクトがいつ破棄されるかをテストする方法がまったくわかりません。

  <system.web>
    <httpModules>
      <add name="OnePerRequestModule" type="Ninject.Web.Common.OnePerRequestHttpModule"/>
    </httpModules>
    ...

HttpModuleを手動で追加する必要がありますか、OnePerRequestそれとも Ninject.Web.MVC がこれを処理してくれますか?

4

1 に答える 1

11

実行概要: いいえ、 で何もする必要はありませんweb.config

次の方法で手動で健全性チェックを行うことができます。

  • 何かを縛るIDisposable .InRequestScope()
  • Controller の ctor に追加する
  • デバッガーをアタッチし、ブレークポイントを配置しますvoid Dispose()
  • 手動でトリガーするHttpRequest

を打った場合Dispose、クマを撃ったのは woz Ninject です (そして、それを証明するためのコール スタックがあります)。

それを配線するのは何ですか?Ninject.Web.CommonNuGet パッケージは以下を追加します。

public static class NinjectWebCommon
{
    public static void Start()
    {
        ...
        DynamicModuleUtility.RegisterModule( typeof( OnePerRequestHttpModule ) );

DynamicModuleUtilityからのものですMicrosoft.Web.Infrastructure(そして、メソッドへの呼び出しStartは以下によって駆動されます:

[assembly: WebActivator.PreApplicationStartMethod( typeof( App_Start.NinjectWebCommon ), "Start" )]

(これはWebActivatorNuGet パッケージに含まれています)


衒学的に言えば、ドッコ は次のように述べています。

より決定論的な動作を得るには、次のいずれかを実行できます。

  1. ...

  2. OnePerRequestModule を登録する Ninject.Web.Common 拡張機能を使用します。

...

登録できます

(私の強調)。もっと露骨にしろよ…


ところで、この質問に答える演習の開始時には、特別な知識はなく、ソースNinject Ninject.Web.Commonとアプリの 1 つだけでした。

于 2013-04-03T12:04:52.307 に答える