2

ninject インジェクションでエンティティとリポジトリ パターンを使用してサイトを構築しました。私の問題は、接続が破棄されないように見えることです。私は約 30 個のリポジトリ (テーブルごとに 1 つ) を持っており、SQL の有効期限がすぐに切れます。コードはインジェクション前のインターフェースしか認識しないため、通常の using ステートメントは使用できません。(各コントローラーには、ninject を介して注入されるリポジトリ インターフェイス インスタンスがあります)。

私はネットを検索しましたが、私にとって正確な解決策を見つけることができませんでした. 誰でも私を助けてもらえますか?コード例:

これは、addBindings() の下の ninject コントローラーにあります。

 ninjectKernel.Bind<IMovieRepository>().To<MovieRepository>().InRequestScope();

そして私のリポジトリの1つ:

 public class MovieRepository : IMovieRepository, IDisposable 
        {
         private Entities dataContext = new Entities();
         public System.Data.Entity.DbContext DbContext 
         {
            get { return dataContext ?? (dataContext = new Entities()); } 
         }
         public void Dispose() { dataContext.Dispose(); }
        }

および Global.asax ファイルで:

 ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory() as IControllerFactory);
4

2 に答える 2

3

あなたのリポジトリ (そしておそらくあなたの DbContexts) は一時的なスコープにバインドされていると思います。これは、Ninject がどこかに注入する必要があるたびに新しいリポジトリが作成されることを意味すると思います。確かではありませんが、これらはすべてアプリケーションの存続期間中存在し、破棄されていない可能性があると推測しています。

リポジトリをリクエスト スコープにバインドして、Web リクエストごとに作成および破棄されるようにしてください。

例えば

Bind<IFooRepository>().To<ConcreteFooRepository>().InRequestScope();

Ninject wikiから:

Ninject には 4 つの組み込みスコープが用意されています。

  • Transient - タイプの新しいインスタンスは、リクエストされるたびに作成されます。(これはデフォルトのスコープです)。バインディングメソッドは .InTransientScope()
  • シングルトン - タイプの単一のインスタンスのみが作成され、後続の各リクエストに対して同じインスタンスが返されます。バインディングメソッドは .InSingletonScope()
  • Thread - タイプの 1 つのインスタンスがスレッドごとに作成されます。バインド方法は .InThreadScope()
  • リクエスト - このタイプのインスタンスは Web リクエストごとに 1 つ作成され、リクエストが終了すると破棄されます。バインディングメソッドは .InRequestScope()
于 2012-04-21T08:49:24.117 に答える
3

この種の問題は通常、寿命の長いオブジェクトが寿命の短いオブジェクトに依存している場合に発生します。たとえば、シングルトン サービスはリクエスト スコープでリポジトリを使用します。

于 2012-04-22T20:01:57.730 に答える