1

我有一个简单的 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);
        }
    }       
}

如果我不想在每个动作中使用“using”和“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);              
    }       
}

这段代码有效,但我认为它应该以其他方式编写。在最后一个代码示例中,上下文能够存活太久。那么有没有什么模式可以给我我的数据库记录而无需每次都“使用”和“ToList()”?

4

1 回答 1

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);              
    } 
 }
于 2012-09-20T07:39:21.577 回答