1

ASP.NET MVC 4 アプリケーションで Spring.NET の IOC コンテナーを使用しています。各コントローラーは、コンテナーから EF データ コンテキストを取得しています。

    private readonly IDBContext db =
        (IDBContext) ApplicationHelper.ApplicationContext.GetObject("DatabaseContext");

私はコントローラーを足場にしました。デフォルトでは、DB接続が破棄されるIDisposableインターフェースを実装しています-次のように:

    protected override void Dispose(bool disposing)
    {
        this.db.Dispose();
        base.Dispose(disposing);
    }

いいですね~そのままにしておきたいです。ただし、呼び出された 2 番目のコントローラーは例外を発生させ、データベース コンテキストが破棄されたことを示します。

だから - 私がしたいのは、次のコントローラーがGetObject()メソッドを呼び出すときに、オブジェクトが破棄されたかどうかを IOC コンテナーにチェックさせることです。それは可能ですか、それともデザインを変更する必要がありますか?

4

2 に答える 2

1

デフォルトでは、spring.net Web アプリケーション コンテナーで構成されたオブジェクトには、「アプリケーション」スコープがあります。これは、という名前のインスタンスDatabaseContextが、Web アプリケーションの起動時に一度作成されることを意味します。このインスタンスを使用する最初のコントローラーはそれを破棄し、その後は他のコントローラーで使用できなくなります。

一般に、IOC コンテナーを使用する場合、dispose 実装を使用してコントローラーでここで行っているように、オブジェクトの有効期間を自分で管理することはお勧めできません。可能であれば、コンテナーでオブジェクトの有効期間を管理できるようにする必要があります。

この特定のケースでは、DatabaseContextusingrequestスコープを作成するのが理にかなっています。そうするとき、春のコンテナはDatabaseContextあなたの要求の最後にあなたを処分します。this.db.Dispose(); これを行うときに、からを削除できますController.Dispose

asp.net を使用した IoC (spring.net) の質問- ctor は、コントローラーに非シングルトン オブジェクトを注入しました - どこに配置しますか? 最近やってきた。それはあなたにとっても興味深いかもしれません。

于 2012-06-24T10:58:16.913 に答える
0

IoCコンテナのセットアップ方法ではIDBContext、シングルトンとして構成したように見えます。

インスタンスベースに変更しますIDBContext

于 2012-06-24T09:42:13.643 に答える