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

このコードは機能しますが、他の方法で記述する必要があると思います。最後のコード例では、コンテキストが長すぎる可能性があります。では、毎回「using」や「ToList()」を行わなくてもdbレコードを取得できるパターンはありますか?

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 に答える