如何处置在MVC3控制器库对象(How to dispose of repository objec

2019-09-16 15:17发布

我的几乎所有控制器都被初始化这样的实例化的库:

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

我想尝试,并确保我的仓库总是妥善处置,尤其是看到我在他们做模拟,而且我相信我们必须要小心这里。 但是,我不希望有始终包裹在一个新的每一个仓库的呼叫using循环中的每一个动作方法。

如何寿命和处置控制器实例后MVC3看,是不够的,如果我实现一次性他们,在析构函数控制我的回购处置?

Answer 1:

要解决这个问题,最好的办法是使用依赖注入(也称为控制或IOC反转),并从而创建存储库和设置的自动定制IControllerFactory。 下面是一篇文章,解释如何做到这一点:

依赖注入在ASP.NET MVC:控制器

对于MVC3,你可能会发现一些文章用的IDependencyResolver而不是推荐,但你应该小心的是,因为该接口没有一个释放的回调,将导致内存泄漏(取决于其IOC容器,你决定使用)。

如果你是新的依赖注入,在网络上搜索关于它背后的想法的文章。

如果你不想切换到使用国际奥委会,那么你可以使用一个基本的控制器,它覆盖OnActionExecuted方法和所有IDisposables的处置。 例如:

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);


文章来源: How to dispose of repository objects in MVC3 controllers