Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / как корректно диспозе сделать / 12 сообщений из 12, страница 1 из 1
13.10.2013, 00:21
    #38425411
fokin_fgdfd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
использую EF /
есть метод в репозитории, который возвращает:

aaaEntities db = new aaaEntities();
return db.Messages.OrderBy(x=>x.idMessage).Skip((_nPage - 1) * _nPageSize).Take(_nPageSize).AsEnumerable();

как и где корректно сделать диспоузе DBcontextу?
если делать using () {} здесь же, то получаю сообщение:
Невозможно завершить операцию, поскольку класс DbContext был удален.
...
Рейтинг: 0 / 0
13.10.2013, 01:03
    #38425430
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
fokin_fgdfd,
вариантов несколько
перекройте protected virtual void Dispose(bool disposing) у контроллера..
зы он для этого и виртуальный
...
Рейтинг: 0 / 0
13.10.2013, 01:07
    #38425432
saaaaaaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
Где-то в степиfokin_fgdfd,
вариантов несколько
перекройте protected virtual void Dispose(bool disposing) у контроллера..
зы он для этого и виртуальный
и где вызывать этот диспоуз
...
Рейтинг: 0 / 0
13.10.2013, 01:15
    #38425436
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
saaaaaaa,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 private bool _disposed = false;
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
               тут и вызывай...
                _disposed = !_disposed;
            }
            base.Dispose(disposing);
        }
...
Рейтинг: 0 / 0
13.10.2013, 01:24
    #38425443
fokin_fgdfd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
Где-то в степиsaaaaaaa,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 private bool _disposed = false;
        protected override void Dispose(bool disposing)
        {
            if (!_disposed)
            {
               тут и вызывай...
                _disposed = !_disposed;
            }
            base.Dispose(disposing);
        }



Не. Где диспозе контекста вызывать это я понимаю. Я спрашивал про диспозе контроллера..
Но он походу вызывается.. Явно вызывать не надо
...
Рейтинг: 0 / 0
13.10.2013, 01:29
    #38425448
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
fokin_fgdfd,
ну дык встань отладчиком и посмотри(........ждаукжщпдша цухацу)
если bool disposing= true, значит за тебя его кто то вызвал, али как еще думаешь?
...
Рейтинг: 0 / 0
13.10.2013, 12:39
    #38425573
gfgffffgfgfg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
А какие еще способы есть?
...
Рейтинг: 0 / 0
13.10.2013, 15:48
    #38425703
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
gfgffffgfgfgА какие еще способы есть?

http://stackoverflow.com/questions/4675753/using-autofac-in-a-multi-layered-architecture

грубо говоря, вы больше не делаете никаких Dispose и по большему счёту совершенно не заботитесь об этом. using для слабаков и неудачников!
...
Рейтинг: 0 / 0
14.10.2013, 11:59
    #38426311
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
МСУ,All,
вот что получилось:
получить слой доступа к данным в виде синглтона для одного запроса, что бы можно было оперировать этим слоем отвязанно из любых мест, хотя что проще суй в кеш контекста и вызывай откуда хочешь..
это просто эссе
что имеем..
интерфейс, который реализуем явно, что убивать что то.
Код: c#
1.
2.
3.
4.
  interface  ISessionClose
    {
        void SessionClose();
    }


сам слой, он как бы не выражен явно, тут каждый может лепить что хочет
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public class LevelData:ISessionClose
    {
        private readonly DBEntities _dbEntities = new DBEntities();
      
        public IEnumerable<Body> GetBody() // это чисто для примера
        {
          return   _dbEntities.Body;
        }

        void ISessionClose.SessionClose()
        {
                _dbEntities.Dispose();
        }
    }


расширение, для получения экземпляра слоя
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 public static class Helper
    {
        public static LevelData LevelData(this HttpRequestBase request)
        {
            return FactoryLevelData<RequestContext>.GetLevelData(request.RequestContext);

        }
    }


Механизм для получения экземпляра слоя запроса, и его ликвидации, ( выбрал словарь)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 internal class FactoryLevelData<T>
    {
        static readonly Dictionary<T,LevelData> ListD=new Dictionary<T, LevelData>();
        public static LevelData GetLevelData(T t)
        {
           if (ListD.ContainsKey(t)==false)
           {
               ListD.Add(t,new LevelData());
           }
            return ListD[t];
        }
        public static void DeleteLevelData(T t)
        {
            if (ListD.ContainsKey(t)==false) return;
            var ld = ListD[t];
            if (ld!= null) 
            ((ISessionClose)ld).SessionClose();
            ListD.Remove(t);
        }
    }


ну и удаление слоя в конце запроса.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 public partial class MvcApplication
    {
        protected void Application_EndRequest(Object sender, EventArgs e)
        {
            FactoryLevelData<RequestContext>.DeleteLevelData(((HttpApplication)sender).Request.RequestContext);

        }
    }


ну и пример доступа к нему
Код: c#
1.
 var example  = HttpContext.Request.LevelData().GetBody().Count();
...
Рейтинг: 0 / 0
14.10.2013, 12:26
    #38426379
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
fokin_fgdfdaaaEntities db = new aaaEntities();
return db.Messages.OrderBy(x=>x.idMessage).Skip((_nPage - 1) * _nPageSize).Take(_nPageSize).AsEnumerable();
Вот из-за ".AsEnumerable()" и все твои проблемы.

В идеале, контроллер (или что там у тебя) должен отдавать представлению полностью инициализированную View-модель. В противном же случае начинаются различные "Select N+1", длинные транзакции и прочее непотребство.
...
Рейтинг: 0 / 0
15.10.2013, 19:56
    #38428726
fokin_fgdfd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
Нахлобучfokin_fgdfdaaaEntities db = new aaaEntities();
return db.Messages.OrderBy(x=>x.idMessage).Skip((_nPage - 1) * _nPageSize).Take(_nPageSize).AsEnumerable();
Вот из-за ".AsEnumerable()" и все твои проблемы.

В идеале, контроллер (или что там у тебя) должен отдавать представлению полностью инициализированную View-модель. В противном же случае начинаются различные "Select N+1", длинные транзакции и прочее непотребство.
не контроллер. Репозиторий. По идее репозиторий толжен возвращать что-то типа IEnumerable... А как сделать правильно?
...
Рейтинг: 0 / 0
17.10.2013, 00:35
    #38430521
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как корректно диспозе сделать
fokin_fgdfd,

Джизус, используй toList() и забудь про dispose
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / как корректно диспозе сделать / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]