Рассмотрим следующий сценарий:DDD логика и Постоянство Незнание
public class Document
{
private ISet<User> sharedWith;
public Document(string name)
{
this.sharedWith = new HashSet<User>();
this.Name = name;
}
public string Name { get; private set; }
public IEnumerable<User> SharedWith
{
get
{
return this.sharedWith;
}
}
public void ShareWith(User user)
{
if (this.SharedWith.Contains(user))
{
throw new Exception("This document is already shared with that user.");
}
this.sharedWith.Add(user);
}
}
Documents
может использоваться совместно сUser
- При совместном использовании документа с пользователем, если документ уже совместно с этим пользователем, выбросить исключение.
- Документы могут использоваться совместно с 10 тысячами пользователей.
Очевидно, что это не очень хорошо масштабируется, из-за необходимости проверки SharedWith
для пользователя существования, в результате ОРМ ленив загрузкой всей коллекции в памяти. I может выполнить проверку наличия в службе приложения, но я рассматриваю эту логику домена, и поэтому для меня имеет смысл, что я храню ее в классе Document.
Я не могу понять, как это должно быть сделано с DDD? И что, если я не смогу использовать ORM, как это сделать?
Я предполагаю, что я должен иметь документ Aggregate и пользователя агрегатный?
Я просмотрел различные ресурсы DDD (я еще не читал книгу), но я не могу найти ответ на этот конкретный сценарий.
этот тип логики может/должен принадлежать в рамках службы домена. просто еще одна тактическая схема борьбы с такими вещами. у вашего репо может быть простой метод, возвращающий bool на то, был ли док совместно с конкретным пользователем – Marco
@Marco, тогда я не понял, что логика должна идти в самих классах домена? Разве это не то, что я назвал логикой домена? – Jeff
граница согласованности, которую обеспечивает совокупность, является ее инвариантами. действительно ли ваши бизнес-пользователи * действительно говорят, что это бизнес-правило или это то, что вы придумали сами? – Marco