控制器,服务和工作单元 - 我应该真正处理数据库上下文吗?

时间:2014-05-20 16:25:33

标签: asp.net asp.net-mvc

基于这篇文章: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 我应该真正处理背景吗?

例如,我有带处置方法的控制器:

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

来自工作单位的服务呼叫处理方法:

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方法。

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

1 个答案:

答案 0 :(得分:2)

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

长短,只需遵循最佳做法并妥善处理您的资源。然后,你不必担心它最终是否会成为问题,因为它永远不会成为问题。

对于它的价值,你可以通过利用一个良好的依赖注入框架来消除一些剃须工作。 DI容器将管理对象的生命周期并处理它们的适当处理。这是一种作弊行为,但由于依赖注入是一种很好的做法,无论如何,你也可以利用它。