Как далеко Внедрение зависимости достигает?

Мое решение для веб-приложения состоит из 3 проектов:

  1. Веб-приложение (ASP.NET MVC)
  2. Слой бизнес-логики (библиотека классов)
  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 несмотря на длинную цепочку зависимости от веб-приложения до Слоя Данных?

5
задан Omar 14 March 2010 в 01:12
поделиться

2 ответа

РЕДАКТИРОВАТЬ

Некоторое время назад у меня возникли некоторые проблемы с этим, но теперь, похоже, он работает:

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;
}
3
ответ дан 14 December 2019 в 13:33
поделиться

Просто хочу отметить, что 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
}
3
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: