linq to sql datacontext для веб-приложения - PullRequest
1 голос
/ 20 марта 2010

Я пытаюсь использовать linq to sql для моего проекта (очень короткий срок), и я вроде как в затруднении. Я не знаю лучший способ иметь контекст данных под рукой для каждого потока запроса.

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

Может кто-нибудь поделиться, пожалуйста, своим решением этой проблемы? Я искал решение и нашел хороший пост от Рика Стрэла: http://www.west -wind.com / weblog / posts / 246222.aspx , но я не совсем понимаю его тему -безопасный или бизнес-объектный подход. Если у кого-то есть упрощенная версия его многопоточного подхода, я бы с удовольствием посмотрел.

1 Ответ

0 голосов
/ 20 марта 2010

В событии BeginRequest Global.asax вы можете сохранить его в HttpContext.Current.Items, что-то вроде «состояния сеанса» для отдельного запроса. Каждый запрос получает собственный контекст, поэтому нет проблем с потоками, если вы сохраняете новый DataContext для каждого запроса.

Вы можете использовать его в событии EndRequest.

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.items.aspx

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

(Извините, набираю этот код на iPhone ... Я знаю ...)

private static MyDataContext GetDataContext() {
    var dc = HttpContext.Current.Items["dc"] as MyDataContext;
    if (dc==null) {
        dc = new MyDataContext();
        HttpContext.Current.Items.Add("dc", dc);
    }
    return dc;
}
...