C # Linq-to-Sql - Следует ли удалять DataContext с помощью IDisposable
-
03-07-2019 - |
Вопрос
У меня есть несколько методов, которые имеют дело с базой данных, и все они начинаются с вызова
FaierDbDataContext db = new FaierDbDataContext();
Поскольку объект Linq2SQL DataContext реализует IDisposable, следует ли использовать это с "использованием"?
using (FaierDbDataContext db = new FaierDbDataContext()) {
// use db here
}
Каковы последствия его использования тем или иным способом?
Решение
В отличие от большинства типов, которые реализуют IDisposable, DataContext на самом деле не нуждается в удалении - по крайней мере, не в большинстве случаев.Я спросил Мэтта Уоррена об этом дизайнерском решении, и вот его ответ:
Есть несколько причин, по которым мы внедрили IDisposable:
- Если логике приложения необходимо сохранить объект после того, как ожидается, что DataContext будет использоваться или действителен, вы можете принудительно выполнить этот контракт, вызвав Dispose.Отложенные загрузчики в этот объект по-прежнему будет ссылаться на DataContext и попытается использовать его если какой-либо код попытается перейти к отложенным свойствам.Эти попытки потерпят неудачу.Dispose также заставляет DataContext сбрасывать свой кэш материализованных объектов, чтобы один кэшированный объект не был случайно поддерживать в рабочем состоянии все объекты, материализованные через этот DataContext, что в противном случае привело бы к тому, что выглядит как утечка памяти.
- Логику, которая автоматически закрывает соединение DataContext, можно обмануть, оставив соединение открытым.DataContext полагается на код приложения, перечисляющий все результаты запроса с момента перехода к конец результирующего набора запускает закрытие соединения.Если приложение использует метод IEnumerable MoveNext вместо инструкции foreach в C # или VB, вы можете завершить перечисление преждевременно.Если в вашем приложении возникают проблемы с не закрывающимися соединениями, и вы подозреваете, что автоматическое закрытие не работает, вы можете использовать шаблон Dispose в качестве обходного пути.
из самого Источник
Не связан с StackOverflow