присоединение linq к sql datacontext к httpcontext в бизнес-слое

Мне нужен мой linq к sql datacontext, чтобы быть доступным через мой слой бизнеса/данных для всех моих объектов репозитария к доступу. Однако, так как это - веб-приложение, я хочу создать и уничтожить его на запрос. Я задаюсь вопросом при наличии singleton-класса, который может лениво создать и присоединить datacontext к текущему HttpContext, работал бы. Мой вопрос: datacontext расположить автоматически, когда запрос заканчивается? Ниже код для того, что я думаю. Был бы это выполнять мою цель: имейте ориентированный на многопотоковое исполнение datacontext экземпляр, который лениво доступен и автоматически расположен, когда запрос заканчивается?

public class SingletonDC
{
    public static NorthwindDataContext Default
    {
        get
        {
            NorthwindDataContext defaultInstance = (NorthwindDataContext)System.Web.HttpContext.Current.Items["datacontext"];
            if (defaultInstance == null)
            {
                defaultInstance = new NorthwindDataContext();
                System.Web.HttpContext.Current.Items.Add("datacontext", defaultInstance);
            }
            return defaultInstance;
        }
    }
}
6
задан Riz 20 March 2010 в 06:47
поделиться

1 ответ

То, что вы представляете, имеет смысл - использование контекста HTTP запроса для хранения вещей - но Нет, одноразовые объекты, хранящиеся в текущем HttpContext, не будут автоматически утилизироваться при завершении запроса. Вам придется как-то сделать это самостоятельно.

Существует событие "End Request", к которому вы можете легко подключиться, например, используя код, который вы вставляете в Global.asax.cs. В методе Application_EndRequest() вы можете вызвать Dispose() вручную для каждого объекта в списке, который этого требует.

Один из способов сделать это - перебрать каждый элемент в контексте, проверить на IDisposable, а затем вызвать Dispose, если это необходимо.

protected void Application_EndRequest(Object sender, EventArgs e)
{
    foreach (var key in HttpContext.Current.Items.Keys) 
    {
        var disposable = HttpContext.Current.Items[key] as IDisposable;
        if (disposable != null)
        { 
           disposable.Dispose();
           HttpContext.Current.Items[key] = null; 
        } 
    }
}

Я думаю, это должно сработать. ASPNET не делает это за вас автоматически. Конечно, вам нужна защита от исключений и так далее, прежде чем использовать этот код в реальном приложении.


Кит Крейг из Vertigo некоторое время назад написал соответствующее сообщение на эту тему, описывая то, что вы хотите сделать, как паттерн, другими словами, способ выполнения действий, который должен повторяться. Он предоставляет класс для помощи в этом, для ленивой загрузки контекста БД и сброса его в текущий контекст. У этого подхода есть некоторые подводные камни - вы можете прочитать о них в обсуждении комментариев к этому посту. Также в комментариях есть куча связанных статей.

8
ответ дан 9 December 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: