Ресурсы дизайна МОК

Ответ - использовать Promise.all(). В случае

6
задан Steve Brouillard 19 November 2008 в 16:11
поделиться

6 ответов

Я был в той же ситуации, и я купил эти две книги

(Версия PDF для распечатывания) http://www.manning.com/osherove/ и http://www.manning.com/prasanna/

4
ответ дан 8 December 2019 в 14:48
поделиться

Необходимо определенно проверить скринкасты МОК на dimecasts.net. Они очень просты и помогут Вам схватить некоторые понятия.

4
ответ дан 8 December 2019 в 14:48
поделиться

Я должен направить Вас к тому же проекту с открытым исходным кодом, на который я ответил для человека, спрашивающего, например, хорошего поблочного тестирования.

Ища *маленький*, открытый исходный код, c# проект с обширным Поблочным тестированием

Я рекомендую смотреть на CarTrackr, он имеет широкий спектр технологий .NET, что разработчик должен быть знаком с (Единица, платформа MVC особенно) и имеет обширное поблочное тестирование. Проект достаточно прост к обзору в 1 нахождении, но достаточно комплексе на самом деле быть больше, чем подтверждение концепции. Их codeplex URL по http://www.codeplex.com/CarTrackr

2
ответ дан 8 December 2019 в 14:48
поделиться

Я предложил бы, чтобы Вы проверили книгу James Kovacs, упомянутый в этом сообщении в блоге. Каждый особенно остр для Вашей ситуации. Это "Работает Эффективно с Унаследованным кодом". Это имеет очень хорошие объяснения понятия рефакторинга. Это также дает примеры их понятие это, хотя в C#, за Java и C++, очень легко следовать.

3
ответ дан 8 December 2019 в 14:48
поделиться

Эта статья Ayende является лучшим введением в МОК, который я когда-либо видел.

1
ответ дан 8 December 2019 в 14:48
поделиться

Я могу только описать то, что мы придумали. Мы одолжили синтаксис удобства использования и такой из различных электронных библиотек, но код является все нашим.

В основном мы имеем то, что мы называем ServiceContainer, объектом. Всегда существует глобальный экземпляр его, одноэлементная копия, при необходимости статичный, и таким образом в веб-приложении, совместно использованном всеми пользователями в appdomain.

ServiceContainer содержит правила. В правилах говорятся вещи как то, Если кто-то просит объект типа у XYZ, вот то, как Вы идете о предоставлении им с ним.

Например, правило могло бы состоять в том, что для некоторого кода для получения объекта, который реализует IDbConnection контейнер создал бы, настроил бы и возвратил бы новый объект SqlConnection.

Рассматриваемый код таким образом не знал бы, и не уход, что он использует объект SqlConnection, в противоположность объекту OleDbConnection.

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

Теперь, рассматриваемому коду здесь должны были бы дать контейнер, который он должен использовать, и таким образом правила. Это означает, что с точки зрения поблочного тестирования, я мог создать новый экземпляр ServiceContainer, запишите новые правила в него для тестирования и попросите, чтобы код сделал свою вещь. В конечном счете код хотел бы выполнить некоторый SQL (в этом экземпляре) и вместо того, чтобы говорить с реальной базой данных, это назовет мою тестовую реализацию IDbConnection и IDbCommand, и таким образом даст мне возможность проверить, что вещи работают.

Что еще более важно, это дает мне способ возвратить назад известные фиктивные данные, соответствующие тесту, не имея необходимость копировать всю базу данных.

Теперь, для инжекционной части, в нашем случае мы можем попросить, чтобы контейнер предоставил нам объекты, который должен быть создан, который полагается на другие объекты.

Например, скажем, у нас есть интерфейс IDataAccessLayer и реализация MSSQLDataAccessLayer.

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

public MSSQLDataAccessLayer(ILogger logger) { ... }

В объекте ServiceContainer мы зарегистрировали следующие правила (это - наш синтаксис, Вы не найдете, что где-либо еще, но должно быть достаточно легко следовать):

ServiceContainer.Global.RegisterFactory<ILogger, FileLogger>()
    .FactoryScoped()
    .WithParameters(
        new Parameter("directory", @"C:\Temp")
    );
ServiceContainer.Global.RegisterFactory<IDataAccessLayer, MSSQLDataAccessLayer>()
    .FactoryScoped();

FactoryScoped подразумевает, что каждый раз я прошу у контейнера объект, я получаю новый.

Правила, если я пишу им на английском языке, похожи на это:

  • Если кому-либо нужна реализация, если ILogger, создайте новый объект FileLogger и возьмите конструктора, которому нужен параметр "каталога", и используйте того конструктора при передаче в "C:\Temp" как аргумент
  • Если кому-либо нужна реализация IDataAccessLayer, создайте новый MSSQLDataAccessLayer

Заметьте, что я сказал, прежде, что конструктор к MSSQLDataAccessLayer берет ILogger, уже я не указывал параметров здесь? Это дает мне следующий код для овладения расположенным на слое объектом доступа:

IDataAccessLayer dal = ServiceContainer.Global.Resolve<IDataAccessLayer>();

Что происходит, теперь то, что контейнерный объект выясняет, что там объектом является MSSQLDataAccessLayer, и что он имеет конструктора. Этот конструктор требует объекта ILogger, но о чудо, контейнер знает, как сделать тот. Контейнер таким образом создаст новый объект FileLogger и передаст это конструктору объекта MSSQLDataAccessLayer, тихо.

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

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

Правила дают нам, много из включается, как на самом деле обеспечить экземпляры объектов:

  • От делегата/метода, что означает, что мы можем сделать все волшебство построения зависимых объектов сами, если мы хотим
  • Автоматически от конструктора (или автоматически вычисленный, какой использовать, или мы можем обеспечить достаточному количеству фиктивных параметров именами/типами для выбора одного),
  • Или мы можем предоставить существующий экземпляр контейнеру (это затем отсортирует - быть похожим на одиночный элемент),

Мы посмотрели на autofac прежде придумывающий наше собственное, в основном мы просто посмотрели на примеры показа Wiki синтаксиса вызова и затем сели и записали нашу собственную систему, которая сделала то, в чем мы нуждались.

2
ответ дан 8 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

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