расширение httpcontext и соображения IOC

#c# #entity-framework-4 #inversion-of-control

#c# #entity-framework-4 #инверсия управления

Вопрос:

Привет создал метод расширения для управления жизненным циклом контекста EF. Мой код приведен ниже

 public static Entities GetCentralRepositoryContext(this HttpContext httpcontext) 
{
    if (HttpContext.Current.Items["context"] == null) 
    {
        HttpContext.Current.Items["context"] = new Entities(); 
    }

    return (Entities)HttpContext.Current.Items["context"];
}
  

Я создал много слоев в своем решении в виде проектов и начал думать о IOC. Приведенный выше код находится в моем проекте уровня BL, но для его работы мне нужно создать ссылку на мой уровень DL, поскольку именно там находится класс entities. Как я могу удалить ссылку на мой уровень DL и внедрить в свой метод расширения. Возможно ли это вообще?

Ответ №1:

Подход, который вы используете, имеет несколько проблем. Прежде всего, статические методы, как правило, являются проблемой для слабой связи, и вы быстро заметите это при попытке модульного тестирования вашего кода. Кроме того, ваш бизнес-уровень зависит от System.Web , что делает вашу технологию бизнес-уровня специфичной, что очень затруднит перенос части системы, например, в службу Windows, и снова делает модульное тестирование практически невозможным.

Вместо этого начните вводить свой Entities класс в конструктор всех типов, которые в нем нуждаются. В начале каждого запроса вы можете создать график зависимостей служб в вашем приложении, специфичный для этого запроса. На этом этапе вы можете определить, что у Entities экземпляра должно быть время жизни веб-запроса.

Это, однако, начнет становиться громоздким, чтобы обойтись без рамки DI. Или, по крайней мере, платформа DI значительно упростит это.

Когда вы начнете писать модульные тесты, вы обнаружите, что это будет очень сложно при непосредственном использовании EF ObjectContext в вашем приложении. Эта статья может дать вам несколько идей о том, как абстрагироваться ObjectContext от тестируемого интерфейса.