如何在MVC3控制器中处置存储库对象

Pro*_*ofK 3 .net asp.net-mvc asp.net-mvc-3

几乎所有的控制器都有一个初始化器实例化的存储库,如下所示:

public class CompanyController : CtsController
{
    ICompanyRepository _repository = new CompanyRepository();
Run Code Online (Sandbox Code Playgroud)

我想尝试确保我的存储库总是妥善处理,特别是看到我冒充他们,我相信一定要小心.但是,我不希望总是using在每个操作方法的新循环中包装每个存储库调用.

MVC3如何处理控制器实例的生命周期和处理,如果我在它们上实现Disposable并在控制器的析构函数中处理我的repos就足够了吗?

Rob*_*ent 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中:

var myRepository = new MyRepository();
Disposables.Add(myRepository);
Run Code Online (Sandbox Code Playgroud)