在控制器中部署EF上下文的更好方法

时间:2012-09-19 13:19:02

标签: asp.net-mvc entity-framework

我有一个简单的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()”的情况下为我提供我的数据库记录?

1 个答案:

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