代码之家  ›  专栏  ›  技术社区  ›  keithwarren7

确保对在控制器中创建并传递给视图的对象的IDisposable调用

  •  3
  • keithwarren7  · 技术社区  · 14 年前

    我是新来的asp.netmvc,所以这可能是一个noob的问题,但这里是。。。

        public ActionResult Index()
        {
            using (var db = new MyObjectContext())
            {
                return View(db.People);
            }
        }
    

    如果我运行这段代码,我会得到一个错误(ObjectDisposedException),因为在视图对数据执行操作之前,ObjectContext已经被释放。这里有不同的方法吗?如何确保我的物品尽快被处理掉?

    2 回复  |  直到 14 年前
        1
  •  9
  •   Levi    14 年前

    private IDisposable _objectToDispose;
    
    public ActionResult Index() {
      var db = new MyObjectContext();
      _objectToDispose = db;
      return View(db.People);  
    }
    
    protected override void Dispose(bool disposing) {
      if (disposing && _objectToDispose != null) {
        _objectToDispose.Dispose();
      }
      base.Dispose(disposing);
    }
    

    MVC框架将自动调用控制器。处理()在请求的末尾。

        2
  •  3
  •   Darin Dimitrov    14 年前

    public interface IPersonRepository
    {
        IEnumerable<Person> GetPeople();
    }
    
    public class PersonRepositorySql : IPersonRepository, IDisposable
    {
        private MyObjectContext _db = new MyObjectContext();
    
        public IEnumerable<Person> GetPeople()
        {
            return _db.People;
        }
    
        public void Dispose()
        {
            _db.Dispose();       
        }
    }
    
    public class HomeController : Controller
    {
        private readonly IPersonRepository _repository;
    
        public HomeController(IPersonRepository repository) 
        {
            _repository = repository;
        }
    
        public ActionResult Index()
        {
            IEnumerable<Person> people = _repository.GetPeople();
    
            // Using AutoMapper here but could be anything:
            IEnumerable<PersonViewModel> peopleViewModel = Mapper
                .Map<Person, PersonViewModel>(people);
    
            return View(peopleViewModel);
        }
    }
    

    现在,存储库的处置是它的创建者关心的问题,如果您遵循良好的实践,它就是一个依赖注入框架。为了实例化您的控制器,您需要将存储库的实例传递到构造函数中,而大多数好的DI框架将自动处理实现 IDisposable .

    推荐文章