2012-09-19 62 views
1

我有一個簡單MagazineRepository類處置EF上下文控制器

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

和一個簡單的控制器更好的辦法每個Action中的「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);    
    }  
} 

這段代碼的作品,但我認爲它應該寫在其他方式。在上一個代碼示例中,上下文能夠活得太久。 那麼有沒有任何模式,可以給我我的db記錄每次沒有「使用」和「ToList()」?

+0

您能否詳細說明下面這行:那麼是否有任何模式可以在不使用「使用」和「ToList()」的情況下爲我提供db數據記錄?據我瞭解你的問題,使用(){...}將服務於你。爲什麼你明確地處理對象。您正在編寫託管代碼,因此GarbegCollector將爲您處理此任務。 – 2012-09-19 13:26:01

+0

在最終的應用程序中,我將在每個應用程序中使用10次操作和幾次庫存方法調用。所以我將不得不爲每個人寫「使用」。所以我想知道我是否可以避免它。在析構函數中處理()實體框架上下文是否可行? – Rhot

回答

2

有人回答我的問題,但後來刪除它。 Idea是重寫控制器的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);    
    } 
}