Инкапсуляция объектов домена: статические методы против классов обслуживания - PullRequest
2 голосов
/ 26 января 2011

Я прочитал в книге DDD (Эрик Эванс), что процедуры, которые необходимо использовать в презентации, должны быть перенесены в классы услуг. Например, BankAccountManagementService имеет методы ChangeBankAccount, GetByAccountId ....

Однако мне нужно инкапсулировать установщики некоторых свойств, чтобы запретить их присваивание другим бизнес-объектам. Так как C # не имеет дружественных классов, этот тип инкапсуляции невозможно использовать в случае Сервисов. Но это можно сделать статическими методами бизнес-объекта BankAccount.

(1) Как вы решаете это ограничение в случае использования Сервисов по вышеуказанной причине?

Редактировать: дополнительный вопрос

(2) Почему плохо использовать статический метод вместо сервисов? Я могу поместить их в отдельный частичный файл класса, чтобы не смешивать код proc с кодом Entity.

Заранее спасибо:)

1 Ответ

6 голосов
/ 26 января 2011

Если свойства объекта домена не должны быть установлены (неизменяемые), то сделайте их частными (или защищенными).

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

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

РЕДАКТИРОВАТЬ: Создание статичных объектов - это архитектурная черная дыра: вы не можете наследовать или изменять их любым способом.Это делает невозможным использование внедрения зависимостей.Управление версиями сложнее;после того как вы сделали статические и использованные, это решение будет трудно изменить.Кроме того, ваш статический метод может не использовать данные экземпляра сегодня, но это может понадобиться в будущем.

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

...