2012-01-03 5 views
2

ASP.Net MVC 3アプリケーションでメモリリークが発生しており、IoCコンテナの問題である可能性があります。MVCApplication内のIoCコンテナへの静的な参照によってメモリリークが発生しますか?

MvcApplicationは、WindsorContainerオブジェクトを作成し、それを移入して、このような静的フィールドに格納します。

public class MvcApplication : System.Web.HttpApplication, IContainerAccessor 
{ 
    private static WindsorContainer container; 

    protected void Application_Start() 
    { 
    ControllerBuilder.Current.SetControllerFactory(
     new WindsorControllerFactory(container)); 
    } 
} 

は、それが静的フィールドでコンテナを保持するために、ここで正しいですか?私が理解する限り、コンテナ自体は、MVCApplication自体の長さだけ存続する必要があります。静的にすると複数のMVCApplicationインスタンス間で単純に共有されるため、正しく配置されていないのだろうかと思います。

+1

... MvcApplicationが処分する際、コンテナ自体を処分するウィンザーわからない場合がありますが、私はUnityとNinjectの両方を使用して、その子コンテナを見つけましたリクエストごとに最適です。なぜアプリケーションの寿命の間、このコンテナを保持していますか? – Yuck

答えて

1

このようにしてコンテナを作成し、静的フィールドとしてアプリケーションオブジェクトに格納することができます。コンテナによって作成されたオブジェクトのライフタイムを制御できます(page参照)。 Webアプリケーションの場合は通常の寿命が要求ごとにある - 上記のページからコピー例:

Kernel.Register(
Component.For<ISession>() 
    .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()) 
    .LifestylePerWebRequest() 
); 

そして、この場合、あなたはMvcApplicationクラスの複数のインスタンス間でそれを共有する必要はありません - HttpApplicationの一実装は、通常はありますWebアプリケーションのクラス。

+0

よろしくお願いいたします。経験から、明らかな理由がない静的な値を保持することは、漏れの原因となる傾向がありましたが、この場合は問題にならない可能性があります。 – Richard

+0

静的フィールドを持つことは、必ずしもすべての悪の根ではありません。 –

+0

私はそうは思いませんが、静的フィールドを持つということは、実際の型が値にリンクされていることを意味し、必要であれば決してクリーンアップされない可能性があります。 – Richard

2

キャッスルウィンザーを使用する場合は、コンテナ自体が使い捨てのオブジェクトを処分できるようにするため、Register Resolve Releaseパターンに従うことが重要です。

ASP.NET MVCの場合、これはControllerFactoryがReleaseControllerからReleaseを呼び出す必要があることを意味します。この答えは、より詳細な説明が含まれています:Explain the mysterious world of IoC and automatic Dispose

あなたはまた、具体的

+0

これは静的フィールドに関する私の質問に対する答えを説明していませんが、非常に便利です。あなたは私のメモリリークの問題をちょうど解決したかもしれません。ありがとうございました。 – Richard

関連する問題