О том, как я получаю доступ к моему DataContext (и является ли это неправильно) - PullRequest
1 голос
/ 21 февраля 2012

Я использую следующее, static class для доступа к контексту данных в моем приложении

public static class DataContext
{
    internal const string _contextDataKey = "dataContext";

    /// <summary>
    /// Returns a unique data context that lives for the duration of the request, which can be from ASP.NET or a WCF service
    /// </summary>
    /// <returns>The entity data model context for the current request</returns>
    public static EntityDataModelContext GetDataContext()
    {
        IPersistanceContainer state;

        if (HttpContext.Current != null)
        {
            state = new AspNetPersistanceContainer();
        }
        else if (OperationContext.Current != null)
        {
            state = new WcfPersistanceContainer();
        }
        else
        {
            state = new StaticPersistanceContainer(); // this container is thread-unsafe.
        }

        EntityDataModelContext edm = state.Get<EntityDataModelContext>(_contextDataKey);
        if (edm == null)
        {
            edm = new EntityDataModelContext();
            state.Store(_contextDataKey, edm);
        }

        return edm;
    }
}

Забудьте о других контейнерах, которые предназначены для простых тестов приложений WCF и Console соответственно, вот контейнер ASP.NET:

internal class AspNetPersistanceContainer : IPersistanceContainer
{
    public T Get<T>(string key) where T : class
    {
        if (HttpContext.Current.Items.Contains(key))
            return (T)HttpContext.Current.Items[key];

        return null;
    }

    public void Store(string key, object value)
    {
        HttpContext.Current.Items[key] = value;
    }
}

Когда мне нужно получить доступ к context, я просто вызываю DataContext.GetDataContext() и выполняю свой доступ к БД, я никогда не добавляю никаких операторов using.

Если я добавлю оператор using, context подходит для одного использования, и в следующий раз, когда я попытаюсь его использовать, он удаляется. Возбуждение исключения.

Если я этого не делаю, как сейчас, это делает меня немного несчастным, я чувствую, что это тоже не то, что нужно делать, не избавляться от этого.

Так что мне было интересно, что было бы правильно сделать здесь.

Является ли этот дизайн некорректным, и стоит ли мне вообще от него отказываться?

Должен ли я просто придумать способ воссоздания контекста всякий раз, когда он удаляется?

Должен ли я просто оставить дизайн как есть, и это нормально?

Может быть, дизайн "достаточно хорош", есть какие-нибудь книги, которые вы бы порекомендовали мне прочитать по этому вопросу? Я чувствую, что мои навыки в области серверной архитектуры скорее отсутствуют.

1 Ответ

0 голосов
/ 21 февраля 2012

В приложении asp.net одно решение может быть таким:

  1. Создайте свой контекст, когда запрос начинается
  2. Удалите его, когда запрос заканчивается

Вот статья , в которой обсуждается этот подход (для управления сессиями NHibernate, но для EF он почти такой же)

...