Доменно-ориентированный дизайн с переходами между состояниями
Нам необходимо разработать систему хранения данных. Есть 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 - В будущем мы можем добавить больше услуг, и инвариант домена может измениться на - Пользователь может подписаться на несколько услуг.