Уловка , а не , чтобы избавиться от MyEntityContext
. Например, вы можете кэшировать его на время существования запроса и располагать его в конце запроса. Это может выглядеть так:
public static class ContextFactory
{
private static bool disposeRegistered = false;
public static MyEntityContext GetContext()
{
RegisterDispose();
var instance = (MyEntityContext)HttpContext.Current
.Items["MyEntityContext"];
if (instance == null)
{
instance = new MyEntityContext();
HttpContext.Current.Items["MyEntityContext"] =
instance;
}
return instance;
}
private static void RegisterDispose()
{
if (disposeRegistered)
return;
HttpContext.Current.ApplicationInstance
.EndRequest += (s,e) =>
{
var instance = HttpContext.Current
.Items["MyEntityContext"] as IDisposable;
if (instance != null)
{
instance.Dispose();
}
};
this.disposeRegistered = true;
}
}
Метод TestRepo
, который выглядит следующим образом:
public IQueryable<Employee> TestRepo()
{
var x = ContextFactory.GetContext()
return
from employee in x.Employees
where employee.Salary > 1000
select employee;
}
Обратите внимание, как TestRepo
теперь возвращает IQueryable
. Это позволяет другим методам изменять запрос, и только когда вы начнете выполнять его итерацию, запрос будет отправлен в базу данных.
ПРИМЕЧАНИЕ. Вместо зависимости от статического класса ContextFactory
вы также можете добавить MyEntityContext
в типы, которые хотят его использовать. Вы можете использовать это, используя технику, которая называется Dependency Injection.