DDD: обработка очень больших коллекцийC#

Место общения программистов C#
Ответить
Anonymous
 DDD: обработка очень больших коллекций

Сообщение Anonymous »

Я уже видел подобные вопросы, но бизнес-требования были немного другими, поэтому предлагаемые решения мне не подходят. Недавно я изучал DDD и решил, что лучший способ сделать это — переписать один из моих прошлых реальных проектов в стиле DDD. Вот одно требование, с которым я борюсь, немного упрощенное, чтобы опустить некоторые ненужные детали:
  • Пользователь может создать запись «Инцидент» в приложении.
  • Инцидент изначально создается как черновик, и пока это черновик, пользователь может затем добавить к инциденту затронутые серверы.
  • Можно может быть добавлено до 30 000 серверов - но не более того.
  • Черновики могут существовать длительное время (дни, даже недели), а новые серверы можно добавлять в любой момент
  • li>
Я придумал два способа реализации этой логики, однако у них обоих есть некоторые недостатки, и я не уверен, правильно ли они следуют принципам DDD. :
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»