- Пользователь может создать запись «Инцидент» в приложении.
- Инцидент изначально создается как черновик, и пока это черновик, пользователь может затем добавить к инциденту затронутые серверы.
- Можно может быть добавлено до 30 000 серверов - но не более того.
- Черновики могут существовать длительное время (дни, даже недели), а новые серверы можно добавлять в любой момент
- li>
1.
Первоначально очевидный способ смоделировать это — создать совокупный корень под названием «Инцидент», который будет содержать коллекцию объектов AffectedServer/ агрегаты. Затем, когда пользователь добавляет новый сервер, мы извлекаем Инцидент из репозитория и пытаемся добавить сервер. Пример на C#:
Код: Выделить всё
public class Incident
{
//Ommited the constructor and other fields/properties/methods
private List _servers;
public IReadOnlyList _servers;
public void AddServer(AffectedServer server)
{
if (_servers.Count > 30_000)
{
throw new InvalidOperationException("The number of servers cannot exceed 30 000");
}
_servers.Add(server);
// publish the domain events here
}
}
- Другое решение состоит в том, чтобы вместо этого извлечь AffectedServer в отдельный совокупный корень и обрабатывать логику домена (гарантируя, что существует не более 30 000 серверов) в рамках доменной службы. Новый совокупный корень по-прежнему будет находиться в том же ограниченном контексте, что и совокупный корень инцидента, и будет ссылаться на инцидент только по идентификатору. Пример на C#:
Код: Выделить всё
public class AffectedServerDomainService
{
//Ommited the constructor and other fields/properties/methods
public async Task AddServerToIncident(AffectedServer affectedServer)
{
int serverCount = _serverRepository.GetServerCountForIncident(affectedServer.IncidentId);
if (serverCount >= 30_000)
{
throw new InvalidOperationException("The number of servers cannot exceed 30 000");
}
_serverRepository.AddServer(affectedServer);
// publish the domain events here
}
}
Мне кажется, что решение №2 лучше, но прав ли я? Нарушает ли это принципы DDD или это все еще допустимый подход?
Подробнее здесь: https://stackoverflow.com/questions/787 ... ollections
Мобильная версия