Мое решение для веб-приложения состоит из 3 проектов:
Я хочу использовать Ninject для управления временем жизни DataContext
сгенерированный Entity Framework
в Database Layer
.
Уровень Business Logic состоит из классов, который ссылочные репозитории (расположенный в слое базы данных) и мое приложение MVC ASP.NET ссылается на классы обслуживания слоя бизнес-логики для выполнения кода. Каждый репозиторий создает экземпляр MyDataContext
объект от Платформы Объекта
Репозиторий
public class MyRepository
{
private MyDataContext db;
public MyRepository
{
this.db = new MyDataContext();
}
// methods
}
Занятия по бизнес-логике
public class BizLogicClass
{
private MyRepository repos;
public MyRepository
{
this.repos = new MyRepository();
}
// do stuff with the repos
}
Дескриптор Will Ninject время жизни MyDataContext
несмотря на длинную цепочку зависимости от веб-приложения до Слоя Данных?
РЕДАКТИРОВАТЬ
Некоторое время назад у меня возникли некоторые проблемы с этим, но теперь, похоже, он работает:
Bind<CamelTrapEntities>().To<CamelTrapEntities>().Using<OnePerRequestBehavior>();
Вместо использования HttpModule вы можете использовать OnePerRequestBehavior, и он позаботится об обработке контекста в текущем запросе.
РЕДАКТИРОВАТЬ 2
OnePerRequestBehavior необходимо зарегистрировать в web.config, поскольку он также зависит от HttpModule:
В IIS6:
<system.web>
<httpModules>
<add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/>
</httpModules>
</system.web>
С IIS7:
<system.webServer>
<modules>
<add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/>
</modules>
</system.webServer>
ПРЕДЫДУЩИЙ ОТВЕТ
Вы обязаны избавиться от контекста, когда он не нужен. Самый популярный способ в ASP.NET - иметь один объектный контекст для каждого запроса. Я делаю это с помощью HttpModule:
public class CamelTrapEntitiesHttpModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += ApplicationBeginRequest;
application.EndRequest += ApplicationEndRequest;
}
private void ApplicationEndRequest(object sender, EventArgs e)
{
((CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]).Dispose();
}
private static void ApplicationBeginRequest(Object source, EventArgs e)
{
HttpContext.Current.Items[@"CamelTrapEntities"] = new CamelTrapEntities();
}
}
Это правило внедрения:
Bind<CamelTrapEntities>().ToMethod(c => (CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]);
Мой репозиторий принимает ObjectContext в конструкторе:
public Repository(CamelTrapEntities ctx)
{
_ctx = ctx;
}
Просто хочу отметить, что Autofac с интеграцией ASP.Net имеет встроенную поддержку времени жизни запроса. Разрешите экземпляры в RequestContainer
, и они будут удалены (при реализации IDisposable) в конце запроса.
Вы должны сделать свои классы дружественными к DI:
public class MyRepository
{
private MyDataContext db;
public MyRepository(MyDataContext context)
{
this.db = context;
}
// methods
}
public class BizLogicClass
{
private MyRepository repos;
public BizLogicClass(MyRepository repository)
{
this.repos = repository;
}
// do stuff with the repos
}