3

ほぼすべてのコントローラーには、次のようにイニシャライザーによってインスタンス化されたリポジトリがあります。

public class CompanyController : CtsController
{
    ICompanyRepository _repository = new CompanyRepository();

私は自分のリポジトリが常に適切に配置されるように努めたいと思います。特に、私がそれらを偽装しているのを見て、ここでは注意が必要だと思います。ただし、すべてのアクションメソッドで、各リポジトリ呼び出しを常に新しいusingループでラップする必要はありません。

MVC3はコントローラーインスタンスの存続期間と破棄をどのように処理しますか?それらにDisposableを実装し、コントローラーのデストラクタにリポジトリを破棄すれば十分ですか?

4

1 に答える 1

9

これに対処する最善の方法は、依存性注入(制御の反転またはIOCとも呼ばれます)とカスタムIControllerFactoryを使用して、リポジトリが自動的に作成および破棄されるようにすることです。これを行う方法を説明する記事は次のとおりです。

ASP.NET MVCでの依存性注入:コントローラー

MVC3の場合、代わりにIDependencyResolverの使用を推奨する記事がいくつかありますが、そのインターフェイスにはReleaseコールバックがなく、メモリリークが発生するため(使用するIOCコンテナによって異なります)、注意が必要です。

依存性注入を初めて使用する場合は、その背後にあるアイデアに関するいくつかの記事をWebで検索してください。

IOCの使用に切り替えたくない場合は、OnActionExecutedメソッドをオーバーライドし、すべてのIDisposableを破棄するベースコントローラーを使用できます。例えば:

abstract class DisposingController : Controller
{
    protected IList<IDisposable> Disposables;

    protected DisposingController()
    {
        Disposables = new List<IDisposable>();
    }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        foreach (var disposable in Disposables)
        {
            disposable.Dispose();
        }

        base.OnActionExecuted(filterContext);
    }
}

次に、コントローラーで:

var myRepository = new MyRepository();
Disposables.Add(myRepository);
于 2012-04-19T13:18:53.010 に答える