0

У меня есть сводный корень (AR1), который ссылается на другой совокупный корень (AR2) по идентификатору. то есть, как обсуждалось здесь http://www.informit.com/articles/article.aspx?p=2020371&seqNum=4Агрегатный корень, вызывающий другую службу агрегированного корневого домена.

Теперь в одном из моих методов в AR1 мне нужно получить доступ к полному объекту AR2 для выполнения проверки. Я создал службу домена, называемую AR2DomainService, и которая теперь вводится в метод AR1. Например:

public class AR1 
{ 
    public Guid AR2Id; 

    public void DoSomething(IAR2DomainService, aR2DomainService) 
    { 
     AR2 ar2 = ar2DomainService.GetById(Ar2Id); 

     if(ar2.status != Status.OK) 
      //throw exception 

     //do some processing. 

    } 

    public bool DomSomething2(IAR2DomainService, ar2DomainService) 
    { 
      return ar2DomainService.DoSomething(Ar2Id); 
    } 


} 

Это код в порядке?

+0

Имейте в виду, что я никогда не изменяю AR2 ... Я только что читаю свойства. –

+2

Что произойдет, если состояние ar2 будет изменено одновременно с этим кодом? У вас может быть недопустимое состояние. Кроме того, службы домена не предназначены для регидратации агрегатов, хранилищ. Помимо этого, может быть ничего плохого в том, чтобы вводить службу домена в AR-методе, но всегда старайтесь передать наиболее явную зависимость. Например. передавая ar2, а не службу для извлечения ar2. – plalx

+0

Можете ли вы описать бизнес-сценарий, используя настоящую семантику домена, например «перечислить сумму денег из источника в учетную запись бенефициара». В противном случае мы не сможем помочь вам в правильном направлении. –

ответ

1

Как указывает plalx, ​​доменные службы здесь не для извлечения агрегатов. То, что я хотел бы сделать, это скоординировать все действия с помощью Application Service/Command Handler. Он считывает связанный идентификатор корневой корзины от AR1 и извлекает его через репозиторий. Затем он может извлечь соответствующую информацию от AR2 и передать ее в качестве параметра в метод AR1. Обратите внимание, что чем меньше этот параметр, тем лучше. В идеале вы не прошли бы полностью AR2, а только объект Value, содержащий минимальную необходимую информацию (вы не хотите, чтобы у вас возникло желание обновить AR2 в рамках транзакции в AR1).

+0

Я только использовал AR2 для выполнения проверить, чтобы не обновлять его. Внедряете ли вы службу домена или вводите фактическое значение из службы приложения. Разве это не подлежит той же проблеме, то есть параллелизму? –

+0

Несомненно. Я обращался только к стороне зависимости вашего вопроса. Проблема параллелизма может быть проблемой без проблем, если допустимо, что «AR1» подходит к данным «AR2», датируемым несколькими миллисекундами, что трудно сказать, не зная вашего реального домена. Если это неприемлемо, вы должны либо просмотреть свой совокупный дизайн, либо ввести тактику последовательной согласованности, либо применить аппликативную транзакцию по двум агрегатам (не рекомендуется в подходе «Агрегат как транзакционная граница»). – guillaume31

+0

В моем конкретном сценарии параллелизм не является проблемой, поэтому я предполагаю, что просто добавлю AR2 в метод AR1 и проведу проверку. –

 Смежные вопросы

  • Нет связанных вопросов^_^