Доменно-ориентированный дизайн с переходами между состояниями

Нам необходимо разработать систему хранения данных. Есть 3 сервиса хранения: Dropbox, ZohoDocs и pCloud. Пользователь может подписаться на любую из служб хранения или не подписаться вовсе. Каждая служба имеет свои собственные переходы между состояниями.

В дизайне, управляемом доменом, Пользователь является совокупным корнем в нашем ограниченном контексте с несколькими атрибутами, указанными ниже:

User <AggregateRoot> {
  userId
  name
  email
}

Dropbox, ZohoDocs и pCloud считаются объектами.

Подход #1

Отношение "ассоциация" один-к-нулю или-одному определяется:

User(1) to Dropbox(0..1)
User(1) to ZohoDocs(0..1)
User(1) to pCloud(0..1)

Каждая сущность предоставляет метод для выполнения переходов между состояниями.

Пользователь моделирует инвариант - один пользователь может подписаться на любую из услуг

Подход #2

Мы представляем объект под названием "StorageService", который имеет отношение "Состав" к 3 службам.

Отношение "Состав" один к нулю или одному определяется:

StorageService(1) to Dropbox(0..1)
StorageService(1) to ZohoDocs(0..1)
StorageService(1) to pCloud(0..1)

Пользователь имеет однозначную "связь" со службой хранилища.

User(1) to StorageService(0..1)

Каждая сущность предоставляет метод для выполнения переходов между состояниями.

StorageService моделирует инвариант - StorageService может состоять из одной службы за раз

Какой из двух подходов более осуществим и масштабируем? Есть ли здесь подходы лучше?

PS - В будущем мы можем добавить больше услуг, и инвариант домена может измениться на - Пользователь может подписаться на несколько услуг.

0 ответов

Другие вопросы по тегам