Когда я должен избавиться от контекста данных - PullRequest
54 голосов
/ 23 декабря 2008

Я сейчас пишу слой доступа к данным для приложения. Уровень доступа широко использует классы linq для возврата данных. В настоящее время для отражения данных обратно в базу данных я добавил частный элемент контекста данных и открытый метод сохранения. Код выглядит примерно так:

private DataContext myDb;
public static MyClass GetMyClassById(int id)
{
    DataContext db = new DataContext();
    MyClass result = (from item in db.MyClasss
                      where item.id == id
                      select item).Single();
    result.myDb = db;
    return result;
}

public void Save()
{
    db.SubmitChanges();
}

Это грубое упрощение, но оно дает общее представление. Есть ли лучший способ справиться с такой моделью? Должен ли я создавать новый контекст данных каждый раз, когда хочу посетить базу данных?

Ответы [ 3 ]

66 голосов
/ 23 декабря 2008

Это на самом деле не имеет большого значения. Я недавно об этом спрашивал Мэтта Уоррена из команды LINQ to SQL, и вот ответ:

Есть несколько причин, по которым мы реализовали IDisposable:

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

Логика, которая автоматически закрывается соединение DataContext может быть обманом ушел из соединения открыть. DataContext опирается на код приложения, перечисляющий все Результаты запроса с момента получения до конец результирующего набора вызывает соединение закрыть. Если приложение использует IEnumerable Метод MoveNext вместо foreach заявление в C # или VB, вы можете выйти Перечень преждевременно. Если твой приложение испытывает проблемы с соединения не закрываются и вы подозреваю автоматическое закрытие не работает, вы можете использовать утилизацию шаблон как обходной путь.

Но в принципе вам не нужно на самом деле избавляться от них в большинстве случаев - и это умышленно. Я лично предпочитаю делать это в любом случае, так как легче следовать правилу «распоряжаться всем, что реализует IDisposable», чем запоминать множество исключений для него - но вы вряд ли потеряете ресурс, если вы do забудьте избавиться от него.

16 голосов
/ 23 декабря 2008

Рассматривайте ваш datacontext как ресурс. А правило использования ресурса гласит

"приобретают ресурс уже возможно, отпустите его, как только безопасный "

5 голосов
/ 23 декабря 2008

DataContext довольно легкий и предназначен для использования в качестве единицы рабочего приложения. Однако я не думаю, что я бы сохранил DataContext в моем объекте. Возможно, вы захотите взглянуть на шаблоны репозитория, если не собираетесь использовать сгенерированный дизайнером код для управления своими бизнес-объектами. Шаблон репозитория позволит вам работать с вашими объектами, оторванными от контекста данных, а затем повторно присоединять их перед выполнением обновлений и т. Д.

Лично я могу по большей части жить с кодом, сгенерированным дизайнером DBML, с частичными реализациями классов для моей бизнес-логики и логики валидации. Я также делаю сгенерированный дизайнером контекст данных абстрактным и наследуем от него, чтобы позволить мне перехватывать такие вещи, как методы хранимых процедур и табличных функций, которые добавляются непосредственно в контекст данных, и применять там бизнес-логику.

Шаблон, который я использовал в ASP.NET MVC, состоит в том, чтобы внедрить фабричный класс, который создает соответствующие контексты данных, необходимые для единиц работы. Использование фабрики позволяет мне достаточно легко смоделировать контекст данных, используя (1) обертку вокруг существующего класса контекста данных, чтобы он был смоделирован (смоделируйте обертку, так как DataContext не легко смоделируется) и (2) создавая контексты Fake / Mock и фабрики по их созданию. Возможность создавать их по желанию на фабрике делает меня таким, чтобы мне не приходилось хранить их в течение долгого времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...