【发布时间】:2017-09-03 19:55:36
【问题描述】:
我正在尝试从我的通用服务中处理我的 GenericRep 中的 DbContext。
我已经在我的 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