Стратегия рефакторинга, когда слишком много зависимостей введено в сервис или контроллер - PullRequest
10 голосов
/ 17 мая 2011

У меня есть приложение ASP.NET MVC 1, которое использует NHibernate и Castle Windsor для IoC.В контроллеры вводятся классы обслуживания, и эти классы обслуживания обрабатывают всю логику и действия, требуемые приложением.У классов обслуживания есть введенные репозитории.Каждый репозиторий обрабатывает один объект.Объекты отображаются в таблицу БД через NH.Я пытался сохранить отношения один к одному между службами и контроллерами, но некоторые службы используются более чем в одном контроллере.

Проблема заключается в том, что некоторые службы теперь имеют зависимости от 10-15 хранилищ.Например, в системе есть компонент выставления счетов, в котором определенные действия зависят от пользователей, клиентов, рабочих заданий, отдельных позиций рабочего задания, счетов-фактур, отдельных позиций счетов, налогов и т. Д.

Какие стратегии используют люди для эффективного рефакторингакогда дело доходит до перегрузки зависимости?Я подумываю о том, чтобы разделить один сервис на множество сервисов и удалить попытку «один к одному» между сервисами и контроллерами.Но тогда зависимости на уровне контроллера увеличатся.Разделение одного контроллера на несколько контроллеров возможно с предварительным предложением, но я не верю, что это сделано, если вы не разбиваете представления на частичные представления?Я понимаю, что это широкий вопрос, но я больше ищу руководство, чем точные ответы.Не стесняйтесь указывать ссылки на статьи или примеры аналогичного рефакторинга.

Ответы [ 2 ]

14 голосов
/ 17 мая 2011

Ваш подход к хранилищу несовершенен. Вместо того, чтобы иметь репозиторий для каждого типа сущностей в вашем приложении, вы должны сосредоточиться на своих корневых сущностях. Выберите несколько объектов высшего уровня в вашем приложении и создайте свои репозитории вокруг них. НАПРИМЕР. Позиции заказа на работу, скорее всего, не нуждаются в собственном репозитории, поскольку они не могут существовать сами по себе без заказа на работу.

Еще одна вещь, которую вы, вероятно, создали в своем дизайне, - это очень анемичный домен. Таким образом, ваши сущности в значительной степени являются просто объектами POCO, в то время как вся бизнес-логика содержится на вашем уровне обслуживания. Попробуйте переместить часть или большую часть этой логики в домен.

14 голосов
/ 17 мая 2011

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

FWIW глава 6 из моя книга содержит пример этого процесса, а также некоторые умственные упражнения, которые вы можете выполнитьопределить соответствующие кластеры служб для группировки.

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

...