Должен ли Linq to SQL репозиторий реализовать IDisposable - PullRequest
3 голосов
/ 04 июня 2010

За последние несколько дней я гуглял тонну шаблонов хранилища с Linq. Там много информации, но она часто противоречива, и я все еще ищу точный источник.

Одна из вещей, в которых я до сих пор не уверен, заключается в том, должен ли репозиторий создавать экземпляр своего собственного DataContext и иметь метод SubmitChanges, или же DataContext должен быть внедрен, а передача обработана извне. Я видел оба дизайна, но никаких реальных комментариев по поводу рассуждений не получил.

Во всяком случае, следующий шаблон довольно распространен

class Repository<T>
{
    DataContext db = new LinqDataContext();

    public IEnumerable<T> GetAll() { ... }
    public T GetById() { ... }

    ... etc

   public void SubmitChanges() { ... }
}

Итак, мой главный вопрос в вышеописанной реализации, почему хранилищу не нужно реализовывать IDisposable? Я видел буквально сотни примеров, как указано выше, и ни один из них, похоже, не удосужился утилизировать DataContext. Разве это не утечка памяти?

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Удаление DataContext закрывает базовое соединение , если для параметра autoclose установлено значение false. Если вы не вызываете dispose, вам придется ждать, пока GC вызовет его для вас. Вы должны внедрить IDisposable и утилизировать свои репозитории, которые, в свою очередь, должны утилизировать их DataContext.

Другое решение заключается в создании нового контекста данных для каждого метода в вашем хранилище, если ваши методы не работают вместе в рамках одной транзакции. Затем вы можете избавиться от своих контекстов, как только они будут использованы с помощью директивы using ().

2 голосов
/ 04 июня 2010
...