Расширение httpcontext и соображения IOC - PullRequest
0 голосов
/ 12 октября 2011

Привет создал метод расширения для управления жизненным циклом контекста 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"];
}

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

1 Ответ

1 голос
/ 13 октября 2011

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

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

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

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

...