Проверка уровня обслуживания по сравнению с проверкой объекта домена; возможное злоупотребление объектами домена?

Я видел много примеров из книг и статей, в которых предлагалось поместить код проверки на уровень обслуживания. Держите объекты домена «немыми» (иначе говоря, чистые POCO) и обрабатывайте все проверки, которые объект домена может выполнять на уровне обслуживания.

Уровень обслуживания несет ответственность за многое (или, по крайней мере, может быть); аутентификация пользователей, аутентификация ролей, сценарии объектов зависимостей для IoC (регистраторы, обработчики ошибок и т. д.), сценарии объектов домена, сценарии репозиториев и передача объектов домена в репозиторий и из него ... уф!

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

Если вы собираетесь возложить много обязанностей на уровень обслуживания, включая всю проверку объектов домена, есть ли способ «защитить» ваши объекты домена, если кто-то пытается напрямую их написать? Например, может быть, каким-то образом ваши объекты домена теперь не используются определенным клиентом (в данном случае уровнем обслуживания?).

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

Если нет возможности «заблокировать» объекты домена, то почему так много статей, книг и т. Д. Предполагают, что нужно поместить проверку объекта домена на уровень обслуживания? Я бы предположил, заняв оборонительную позицию программирования, что вы должны создать свои объекты домена, чтобы они были пуленепробиваемыми, и полагаться на свой уровень обслуживания для простого уровня кода для пересылки и получения запросов между пользовательским интерфейсом и BAL / DAL.

Был ли у кого-нибудь в реальной жизни опыт "злоупотребления" объектами домена со стороны людей, которые обошли свой уровень обслуживания?


person Michael McCarthy    schedule 24.02.2011    source источник


Ответы (2)


Это 2 разные философии дизайна. Модель расширенного домена против модели анемического домена.

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

Вы можете сделать это с помощью ряда методов:

1) Вы можете сделать все общедоступные объекты домена неизменяемыми (то есть вы не можете изменять данные), используя только только те общедоступные методы, которые являются геттерами. Все методы, которые изменяют ваши объекты, могут быть защищены или упакованы как частные, чтобы к ним могли получить доступ только правильно упакованные службы (по крайней мере, на Java)
2) Вы можете предоставлять только отдельные классы своим внешним разработчикам - поэтому, если у вас есть человек У вас может быть класс PersonInfo, который вы передаете и который ничего не делает, кроме информации.
3) Вы должны предоставить согласованный API для потребителей вашего приложения. Вы в основном не позволяете им обходить ваш уровень обслуживания.

person hvgotcodes    schedule 24.02.2011
comment
Я думаю, №2 очень похож на объект передачи данных? Думаю, я мог бы использовать DTO, ИЛИ, возможно, вернуть интерфейс, который предоставляет только те свойства, которые, по моему мнению, конечный потребитель должен иметь возможность устанавливать / получать? Я поиграю с разными подходами. Я надеялся избежать DTO, поскольку они могут добавить еще один уровень сложности в проект. Спасибо за ответ! - person Michael McCarthy; 02.03.2011
comment
@indiecodemonkey, да, это так. но дело в том, что есть способы заблокировать api. - person hvgotcodes; 02.03.2011

Я думаю, вы можете неправильно понять цель POCO. POCO, насколько я понимаю, не является анемичным предметным объектом, имеющим только свойства и атрибуты. Скорее, POCO просто не привязан к структуре или сложной модели наследования. Объект гибок и заботится только о своей роли в домене.

person Aaron K    schedule 25.02.2011
comment
Согласен с Джошуа. Модель анемичного домена считается антипаттерном по многим хорошо обоснованным причинам. От самого человека martinfowler.com/bliki/AnemicDomainModel.html - person Peter M. Elias; 11.08.2012