Как лучше всего использовать Dispose для «Entity Framework»? - PullRequest
1 голос
/ 13 августа 2011

Что такое истинное использование утилизации? Это первый (мой) подход:

 public class RequestService : IDisposable
        {
            requestDBEntities db;
            public RequestService() //Constructor
            {
                db = new requestDBEntities ();
            }
       public List<RequestStatus> ddlFill()
            {
               return (from rs in db.reqStatus select rs).ToList();
            }
            //Some Insert,Update,Delete methods {}...

        public void Dispose()
            {
                db.Dispose(); //<--Dispose requestDBEntities(); 
                GC.SuppressFinalize(this);
            }

И второй подход:

    public class RequestService : IDisposable
            {
               requestDBEntities db;
               public List<RequestStatus> ddlFill()
                {
              using (db = new requestDBEntities())
                    return (from rs in db.reqStatus select rs).ToList();
                }
            //Some Insert,Update,Delete methods {}...

            public void Dispose()
                {
                    GC.SuppressFinalize(this);
                }

Код страницы позади:

            using (RequestService _reqService = new RequestService ())
               {
                ddlRequestStatus.DataSource = _reqService.ddlFill();
                ddlRequestStatus.DataBind();

                //Some Insert,Update,Delete operations...
               }

Спасибо ..

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Зачем во втором примере вы объявили requestDBEntities db;на уровне класса вместо того, чтобы иметь его в качестве переменной стека?

Сравнивая ваши подходы, возникает вопрос - готовы ли вы создавать requestDBEntities для каждого вызова?Если вы - второй подход лучше, на самом деле, если вы ничего не опубликовали, вам вообще не нужно избавляться.Но у вас будет дополнительное время на создание / освобождение requestDBEntities для каждого вызова.

0 голосов
/ 13 августа 2011

Трудно (невозможно) сказать, какой подход лучше, так как мы не знаем, какой именно дизайн вы выбрали. С точки зрения простого приложения может показаться, что два примера эквивалентны (более или менее), но они действительно ведут себя совершенно по-разному.

Фундаментальный вопрос здесь: должно ли время жизни db быть сравнимым со временем жизни включающего его RequestService экземпляра?

Если да, то первый пример кода - это способ сделать что-то. Ресурсы будут управляться, как и ожидалось (db утилизирует свои ресурсы в то же время, когда объект RequestService должен утилизировать свои ресурсы), и время жизни этих двух будет в значительной степени идентичным (db создается в Конструктор RequestService и db становятся доступными для сбора, как только объект RequestService становится доступным для сбора).

Однако, если ответ «нет», то второй пример - это (почти) способ сделать что-то - так как вы генерируете представление коллекции RequestStatus объекта из db, у вас действительно нет причин держи вокруг себя db больше. Однако, чтобы сделать это немного лучше, могу ли я предложить ограничить область действия db с помощью метода ddlFill:

public List<RequestStatus> ddlFill()
{
    using (var db = new requestDBEntities())
         return (from rs in db.reqStatus select rs).ToList();
}

Нет необходимости в постороннем члене класса, когда достаточно стекового значения.

...