Squeak.ru - шаблоны программирования

Роль сервисов в предметно-ориентированном дизайне

Недавно я обнаружил, что дизайн, управляемый предметной областью (DDD), является лучшим вариантом для некоторых приложений (т. Е. Приложений, в которых задействована сложная бизнес-логика, а не простые операции CRUD, предоставляемые через пользовательский интерфейс).

Я просмотрел следующие сайты по дизайну, управляемому доменами (DDD).

https://www.infoq.com/articles/ddd-in-practice

Дизайн на основе домена: служба домена, служба приложений

Что я не мог заключить / понять, так это следующие моменты:

(1) Какова роль сервисов в проектировании, управляемом доменами (DDD)? Можете ли вы объяснить на примере службы, объекта домена, DAO (с использованием Java)?

(2) Если мне нужно использовать Java для создания объектов домена / бизнеса, какое соглашение об именах следует соблюдать? Это похоже на CustomerBO, ProductBO и т. Д.?

Не могли бы вы помочь мне с простыми примерами использования Java?

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


  • Мне не понравился приведенный ниже пример, поскольку объект домена не выполняет ничего, кроме передачи данных, что является анемичной моделью. Может ли кто-нибудь помочь мне одним наглядным примером? 25.09.2016

Ответы:


1

Это назойливый вопрос, но я постараюсь в какой-то мере на него ответить. Я настоятельно рекомендую посмотреть образец github от Вона Вернона. Он является автором книги Реализация дизайна, управляемого доменом.

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

Возьмем, к примеру, подготовку клиента в домене идентификационного доступа.

Вот несколько довольно наглядных примеров из гитхаба Вона:

Вот объект домена клиента:

package com.saasovation.identityaccess.domain.model.identity;

    public class Tenant extends extends ConcurrencySafeEntit {
        public Tenant(TenantId aTenantId, String aName, String aDescription, boolean anActive) {
         ...   
        }
        public Role provisionRole(String aName, String aDescription) {
          ...
        }
        public void activate(){}
        public void deactivate(){}
        ....

    }

Клиент Репозиторий:

package com.saasovation.identityaccess.domain.model.identity;

public interface TenantRepository {

    public void add(Tenant aTenant);
}

Доменная служба клиента:

package com.saasovation.identityaccess.domain.model.identity;

public class TenantProvisioningService {

    private TenantRepository tenantRepository;

    public Tenant provisionTenant(
            String aTenantName,
            String aTenantDescription,
            FullName anAdministorName,
            EmailAddress anEmailAddress,
            PostalAddress aPostalAddress,
            Telephone aPrimaryTelephone,
            Telephone aSecondaryTelephone) {

            Tenant tenant = new Tenant(
                        this.tenantRepository().nextIdentity(),
                        aTenantName,
                        aTenantDescription,
                        true); // must be active to register admin

            this.tenantRepository().add(tenant);

    }

}

Это служба приложений:

package com.saasovation.identityaccess.application;

@Transactional
public class IdentityApplicationService {

    @Autowired
    private TenantProvisioningService tenantProvisioningService;


    @Transactional
    public Tenant provisionTenant(ProvisionTenantCommand aCommand) {

        return
            this.tenantProvisioningService().provisionTenant(
                        aCommand.getTenantName(),
                        aCommand.getTenantDescription(),
                        new FullName(
                                aCommand.getAdministorFirstName(),
                                aCommand.getAdministorLastName()),
                        new EmailAddress(aCommand.getEmailAddress()),
                        new PostalAddress(
                                aCommand.getAddressStateProvince(),
                                aCommand.getAddressCity(),
                                aCommand.getAddressStateProvince(),
                                aCommand.getAddressPostalCode(),
                                aCommand.getAddressCountryCode()),
                        new Telephone(aCommand.getPrimaryTelephone()),
                        new Telephone(aCommand.getSecondaryTelephone()));
    }
}
19.09.2016
  • Я не понял этого примера, почему у нас 2 сервиса? 20.09.2016
  • Сервисы приложений - это сервисы, которые внешние потребители будут использовать для выполнения своих операций с этим доменом. С другой стороны, доменные службы являются внутренними по отношению к вашему домену и обрабатывают только логику, которая иначе не может быть обработана объектами вашего домена или репозиториями. Если вы посмотрите на полный пример в github, это даст вам лучшее представление. Это всего лишь фрагменты полных классов. 20.09.2016
  • Извините за задержку с ответом, какова здесь роль объекта домена? Он ничего не делает, кроме передачи данных, что является анемичной моделью. 25.09.2016
  • @developer Просто просмотрите весь репозиторий git. Это не займет у вас много времени, но вы многому научитесь. Как я уже сказал, я вставил только часть каждого класса. В объекте домена Tenant так много методов / поведения, что он не анемичен .activate(), offerRegistrationInvitation(String aDescription), provisionRole(...) - лишь несколько примеров. Посмотрите на это здесь. 25.09.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...