Идея состоит в том, чтобы создать класс, который предоставляет контекст, но обрабатывает его хранение в веб-приложении.
На данный момент вот что у меня есть:
public class EntityContext
{
private static String MAIN_CONTEXT_KEY = "MainContext";
private static TISQLEntities _context;
public static void RemoveContext()
{
if (
HttpContext.Current != null
&&
HttpContext.Current.Items[MAIN_CONTEXT_KEY] != null
)
{
((TISQLEntities)HttpContext.Current.Items[MAIN_CONTEXT_KEY]).Dispose();
HttpContext.Current.Items[MAIN_CONTEXT_KEY] = null;
}
if (_context != null)
{
_context.Dispose();
_context = null;
}
}
public static TISQLEntities Context
{
get
{
if (HttpContext.Current == null)
{
if (_context == null)
{
_context = new TISQLEntities();
}
return _context;
}
if (HttpContext.Current.Items[MAIN_CONTEXT_KEY] == null)
{
HttpContext.Current.Items[MAIN_CONTEXT_KEY] = new TISQLEntities();
}
return (TISQLEntities)HttpContext.Current.Items[MAIN_CONTEXT_KEY];
}
}
}
А затем в файле Global.asax:
protected void Application_EndRequest(object sender, EventArgs e)
{
EntityContext.RemoveContext();
}
Идея состоит в том, что, если это выполняется с веб-приложением, контекст создается при первой необходимости (и сохраняется в текущем HttpContext) и уничтожается при завершении запроса.
Если это ситуация с UnitTest, она не создается при первой необходимости и удаляется в TestCleanup (не так важно, как в этом посте, но просто хотелось пояснить объект _context).
Теперь идея этого заключается в том, чтобы не делать это:
using(TISQLEntities context = new TISQLEntities())
{
....
}
Каждый раз, когда я хочу запросить. Я понимаю, что это может быть из-за того, что я ленивый, но я просто думаю, что легче и чище иметь:
EntityContext.Context.User.Select(...)
И избегает «использования», которого я стараюсь избегать в большинстве случаев. Кроме того, я не создаю 9001 контекстов для обратной передачи.
Теперь, что меня интересует, так это то, что я слишком обдумываю это? Должен ли я просто продолжать создавать контекст для каждого метода, который нужен? Сказать по сообщению назад я должен:
- Получить пользователя с идентификатором
- Получить сайт с идентификатором
- Добавление сайта к пользователю (user.Site = foundSite)
- Сохранить пользователя
Это может повлечь как минимум 3 контекста. Является ли структура сущностей достаточно умной, чтобы можно было продолжать создавать контексты всякий раз, когда?