我有一个简单的MagazineRepository类
public class MagazineRepository : IDisposable
{
//EntityFramewokr context
private DataBaseContext _context;
public MagazineRepository()
{
_context = new DataBaseContext();
}
public void Dispose()
{
if (_context != null)
{
_context.Dispose();
}
GC.SuppressFinalize(this);
}
}
一个简单的控制器:
public class MagazineController : Controller
{
public ActionResult Index()
{
//Should to implement using to dispose
using(MagazineRepository magazineRepository = new MagazineRepository())
{
var magazine = magazineRepository.GetAll().ToList(); //Should use ToList() to avoid "Object has been disposed exception".
return View(magazine);
}
}
}
如果我不想在每个动作中使用“使用”和“ToList()”怎么办?如果我将在控制器的析构函数中调用Dispose()上下文方法怎么办?像这样:
public class MagazineController : Controller
{
MagazineRepository _magazineRepository;
public MagazineController()
{
_magazineRepository= new MagazineRepository();
}
~MagazineRepository();
{
if(_magazineRepository!=null)
{
_magazineRepository.Dispose();
}
}
public ActionResult Index()
{
var magazine = magazineRepository.GetAll();
return View(magazine);
}
}
此代码有效,但我认为应该以其他方式编写。在上一个代码示例中,Context能够活得太久。 那么有没有任何模式可以在不使用“使用”和“ToList()”的情况下为我提供我的数据库记录?
答案 0 :(得分:2)
有人回答了我的问题,但随后将其删除了。想法是覆盖控制器的Dispose方法,因为控制器在动作执行后处理。
public class MyBaseController : Controller
{
protected IMyRepository _repository;
public RhotCMSController()
{
_repository = new MyRepository();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (_repository != null)
{
_repository.Dispose();
}
}
base.Dispose(disposing);
}
}
public class MyController : MyBaseController
{
public ActionResult Index()
{
var entities = _repository.GetAll();
return View(entities);
}
}