【问题标题】:Why is there no Dispose method to override in .Net Core?为什么在 .Net Core 中没有可以覆盖的 Dispose 方法?
【发布时间】:2017-09-03 19:55:36
【问题描述】:

我正在尝试从我的通用服务中处理我的 GenericRep 中的 DbContext。

我的通用存储库正在实现此处描述的模式: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

我已经在我的 repo 中设置了第一部分:

public class GenericRepository<T> : IGenericRepository<T>, IDisposable
    where T: BaseEntity
{
    protected readonly ApplicationDbContext _context;
    protected DbSet<T> _dbSet;
    .
    .
    .
    private bool disposed = false;

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

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

现在在文章中他们在 StudentController 中有这个:

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

他们没有 StudentController 实现 IDisposable 或任何东西。 我猜他们似乎能够将 Dispose 重写为 Object 的标准可重写方法。

所以我需要把它放在我的通用服务中。

这是我的通用服务:

public class GenericService<T> : IGenericService<T>
    where T : BaseEntity
{
    private IGenericRepository<T> _genericRepo;

    public GenericService(IGenericRepository<T> genericRepo)
    {
        _genericRepo = genericRepo;
    }
    . 
    .
    .
    public override void Dispose(bool disposing)
    {
        _genericRepo.Dispose();
        base.Dispose(disposing);
    }

所以我的代码上有两个红色波浪线。

1) 找不到合适的方法来覆盖 GenericService。

这是 Full Framework 中的标准可覆盖对象,但不是 .Net Core?

2) 对象在 base.Dispose 调用中不包含 Dispose 的定义。

这只是在 .Net Core 中以某种方式完成了吗?

更新 1:

感谢 Nkosi 在下面的回答(答案 1)。

所以现在我从我的控制器调用 serviceRepo dispose,如下所示:

[Route("api/[controller]")]
public class CasesController : Controller, IDisposable
{
    private readonly IGenericService<Case> _caseGenericService;

    public CasesController(IGenericService<Case> caseGenericService)
    {
        _caseGenericService = caseGenericService;
    }
    .
    .
    .
    private bool disposed = false;

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

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

它有点工作,对于一些处置。 但随后它似乎开始挂起。

【问题讨论】:

  • System.Object 上没有 Dispose()。它们继承自 Controller,它确实具有该方法。
  • Controller 已经继承自 IDisposable。删除Dispose() 方法并将Dispose(bool disposing) 更新为override
  • 看看github上Controller的源代码。您可能需要对处理控制器的方式进行一些修改。
  • 看看这个article here。我认为你通过将 dispose 方法链接在一起来过度设计你的方式。如果您使用的是 dotnetcore DI 框架,它应该为您做正确的事情。

标签: c# asp.net-core-mvc dispose


【解决方案1】:

通用服务必须像在通用存储库中一样定义/实现一次性。由于当前类正在定义它,因此无需覆盖或调用任何基础。

public class GenericService<T> : IGenericService<T>, IDisposable
    where T : BaseEntity
{
    private IGenericRepository<T> _genericRepo;

    public GenericService(IGenericRepository<T> genericRepo)
    {
        _genericRepo = genericRepo;
    }
    . 
    .
    .
    private bool disposed = false;
    // Protected implementation of Dispose pattern.
    protected virtual void Dispose(bool disposing)
    {
        if (disposed)
            return; 

        if (disposing) {
            _genericRepo.Dispose();
            // Free any other managed objects here.
            //
        }

        // Free any unmanaged objects here.
        //
        disposed = true;
    }    

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

参考Implementing a Dispose Method

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2014-10-02
    相关资源
    最近更新 更多