为什么在.Net Core中没有要覆盖的Dispose方法? [英] Why is there no Dispose method to override in .Net Core?

查看:148
本文介绍了为什么在.Net Core中没有要覆盖的Dispose方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过通用服务在我的GenericRep中处理DbContext.

I am trying to dispose of my DbContext in my GenericRep from my Generic Service.

我的通用仓库正在实现此处描述的模式:

My generic repo is implementing the pattern described here: 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

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

I have set up the first part in my 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中具有以下内容:

Now in the article they have this in the StudentController:

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

他们没有实现IDisposable或任何东西的StudentController.我认为它们似乎能够将Dispose作为对Object的标准可重写方法来替代.

They don't have StudentController implementing IDisposable or anything. They just seem to be able to override Dispose as a standard overridable method on Object I guess.

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

So I need to put this in my Generic Service.

这是我的一般服务:

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

所以我的代码上有两个红色的弯曲线.

So I have two red squigglies on my code.

1)找不到合适的方法来替代GenericService.

1) No suitable method found to override for GenericService.

这是Full Framework中的标准可重写对象,而不是.Net Core?

Is this a standard overridable object in Full Framework but not .Net Core?

2)对象不包含基于base.Dispose调用的Dispose的定义.

2) Object does not contain a definition for Dispose on base.Dispose call.

在.Net Core中,这样做是否有所不同?

Is this just done differently somehow in .Net Core?

更新1:

感谢Nkosi在下面给出的答案(答案1).

Thanks Nkosi for your answer below (Answer 1).

所以现在我从控制器中调用serviceRepo进行处理,如下所示:

So now I am calling the serviceRepo dispose from my controller like this:

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

这是一种工作,有一些处理方法.但随后它似乎开始挂起.

It kind of works, for a few disposes. But then it seems to start hanging.

推荐答案

通用服务将必须像通用存储库中那样定义/实现一次性的.当前类正在定义它,因此没有要重写或要调用的东西.

The generic service will have to define/implement disposable just like in the generic repository. There is nothing to override or base to call as the current class is defining it.

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

参考文献实现处置方法

这篇关于为什么在.Net Core中没有要覆盖的Dispose方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆