asp.net - Controller 、服务和工作单元——我真的应该处理数据库上下文吗?

标签 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 我真的应该处理上下文吗?

例如,我有一个带有 dispose 方法的 Controller :

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

所以我的 Controller 从服务调用 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);
    }
}

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

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

最佳答案

从垃圾收集器最终会落后于您可以在您之后进行清理的意义上讲,这不是严格必要的,但是显式处理您不再需要的任何东西仍然是一种很好的做法。 Controller 针对每个请求进行实例化和销毁,因此如果您未能处理掉积累的资源,那么在 Controller 拆卸和下一个 GC 周期之间的过渡期间,您实际上会泄漏内存。如果您正在处理大量请求,如果内存耗尽加起来快于释放速度,则可能会使事情陷入停顿。根据安装在服务器上的 RAM 量,有时您可能最终会分页到硬盘,这确实会降低应用程序性能。

总而言之,只要遵循最佳实践并妥善处理您的资源即可。然后,您不必担心它最终是否会成为问题,因为它永远不会成为问题。

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

关于asp.net - Controller 、服务和工作单元——我真的应该处理数据库上下文吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765228/

相关文章:

c# - ASP .net MVC5 - CSS 样式问题 - "@Html.ValidationMessageFor"

c# - LINQ查询参数可以为空

c# - MVC 中不支持关键字 : '"data source'.

javascript - cookie 和重定向

asp.net - 在 App_Data 中的 MDF 文件上运行 SQL 脚本

.net - 何时需要 ScriptManager/ScriptManagerProxy?

asp.net-mvc - 如何将 HttpRequest 转换为 HttpRequestBase 对象?

c# - C# 中的分析

c# - 如何将 EntityCollection<T> 转换为 List<POCOObj>

asp.net-mvc - 为什么 ASP.NET MVC 上的 Controller 是基于名称的?