Я использую следующее, 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
подходит для одного использования, и в следующий раз, когда я попытаюсь его использовать, он удаляется. Возбуждение исключения.
Если я этого не делаю, как сейчас, это делает меня немного несчастным, я чувствую, что это тоже не то, что нужно делать, не избавляться от этого.
Так что мне было интересно, что было бы правильно сделать здесь.
Является ли этот дизайн некорректным, и стоит ли мне вообще от него отказываться?
Должен ли я просто придумать способ воссоздания контекста всякий раз, когда он удаляется?
Должен ли я просто оставить дизайн как есть, и это нормально?
Может быть, дизайн "достаточно хорош", есть какие-нибудь книги, которые вы бы порекомендовали мне прочитать по этому вопросу? Я чувствую, что мои навыки в области серверной архитектуры скорее отсутствуют.