【问题标题】:controllers, services and unit of work - should I really dispose database context?控制器、服务和工作单元——我真的应该处理数据库上下文吗?
【发布时间】:2014-05-21 00:55:14
【问题描述】:

根据这篇文章:http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 我真的应该处理上下文吗?

例如我有一个带有 dispose 方法的控制器:

public class BlogController : Controller
{        
    private readonly INotesService _notesService;        

    public BlogController(INotesService notesService)
    {
        _notesService = notesService;
    }


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

所以我的控制器从服务调用 dispose 方法:

public class NotesService : INotesService
{
    private readonly IUnitOfWork _unitOfWork;

    public NotesService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }


    public void Dispose()
    {
        _unitOfWork.Dispose();
    }
}

以及从工作单元调用dispose方法:

public class UnitOfWork : IUnitOfWork
{
    private DatabaseContext context = new DatabaseContext();
    private INotesRepository notesRepository;

    public INotesRepository NotesRepository
    {
        get
        {
            if (this.notesRepository == null)
            {
                this.notesRepository = new NotesRepository(context);
            }
            return notesRepository;
        }
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                this.context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

在每个控制器中我必须记得调用 Dispose 方法。更重要的是,如果我的控制器使用许多服务,我必须记住在也称为 Dispose 的控制器方法中对每个服务调用 Dispose 方法。

那么我真的应该处理数据库上下文吗?也许没必要。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    这并不是严格必要的,因为垃圾收集器最终会在你之后清理,但明确地处理你不再需要的任何东西仍然是一个好习惯。控制器会针对每个请求进行实例化和销毁,因此如果您未能处理所积累的资源,那么您实际上是在控制器拆除和下一个 GC 周期之间的过渡期间泄漏内存。如果您要处理大量请求,那么如果内存消耗的增加速度比释放速度快,那么这可能会使事情陷入停顿。根据服务器上安装的 RAM 量,有时您可能最终会分页到硬盘,这确实会降低应用程序的性能。

    无论长短,只要遵循最佳做法并正确处置您的资源即可。然后,您不必担心它最终是否会成为问题,因为它永远不会。

    对于它的价值,您可以通过使用良好的依赖注入框架来减轻一些剃须刀工作。 DI 容器将管理对象的生命周期并适当地处理它们。这有点作弊,但由于依赖注入是一种很好的做法,无论如何,您不妨利用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2010-09-28
      • 2015-04-21
      相关资源
      最近更新 更多