为什么没有Dispose方法在.Net Core中覆盖?

时间:2017-04-08 13:50:03

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

我正试图从我的通用服务处理我的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

我在我的回购中设置了第一部分:

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)对象不包含基于Dis.Dispose调用的Dispose定义。

这在.Net Core中是以不同方式完成的吗?

更新1:

感谢Nkosi在下面给出了答案(答案1)。

所以现在我正在调用serviceRepo来自我的控制器:

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

它有点工作,有些处理。 但它似乎开始悬挂。

1 个答案:

答案 0 :(得分:2)

通用服务必须像通用存储库一样定义/实现一次性服务。当前正在定义它时,没有什么可以覆盖或基于调用。

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