tag:blogger.com,1999:blog-458002489272917533.post561853409090507064..comments2024-02-14T14:07:38.890+05:00Comments on Блог Александра Бындю: Domain-Driven Design: aggregation rootAlexander Byndyuhttp://www.blogger.com/profile/14185486842573956085noreply@blogger.comBlogger90125tag:blogger.com,1999:blog-458002489272917533.post-61446456562639964402012-10-14T08:21:08.118+06:002012-10-14T08:21:08.118+06:00А вообще вычисления времени сдвига для зависимых з...А вообще вычисления времени сдвига для зависимых задач и сохранения изменений это уровень например объекта "Проект".<br /><br />Мне лично кажется что можно инжектить repository-рии доменные объекты. Т.е. я вижу себе такой код:<br /><br />Project project = ProjectRepository.find(ProjectId);<br />project.setTaskRepository(taskRepository);<br /><br />Task task = TaskRepository.find(taskId)Evgeniy Kochnevhttps://www.blogger.com/profile/08577528301843173451noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-79122361384746198892012-10-14T08:02:29.246+06:002012-10-14T08:02:29.246+06:00Возможно уже не очень актуально, но по поводу сдви...Возможно уже не очень актуально, но по поводу сдвига даты у задач (tasks) - можно не хранить конкретную дату начала определенного таска (тем более если начало одной задачи зависит от времени окончания другой) - можно просто хранить сколько времени нужно на выполнения задачи - соответственно при добавлении или изменении времени старта одной задачи не нужно будет обновлять начало зависимых задач в Evgeniy Kochnevhttps://www.blogger.com/profile/08577528301843173451noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-17914107494830762762012-08-21T15:30:14.896+06:002012-08-21T15:30:14.896+06:00Если в корзину можно добавить продукты, то метод д...Если в корзину можно добавить продукты, то метод добавления продуктов будет в корзине. Зачем создавать еще один класс, в котором будет предметная область, когда уже есть классы, описывающую эту предметную область?<br /><br /><br />> Тогда код приложения будет более гибок к изменениям в бизнес логике.<br />Например? И надо сразу понимать, в чем будет гибкость?Alexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-3935895412508456882012-08-12T00:22:47.453+06:002012-08-12T00:22:47.453+06:00Возможно уже не очень актуально, но почему бы логи...Возможно уже не очень актуально, но почему бы логику не вынести в отдельные классы, в так называемые "доменные сервисы"? Тогда код приложения будет более гибок к изменениям в бизнес логике.Azat Sattarovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-75854580879918390642011-08-30T17:56:43.980+06:002011-08-30T17:56:43.980+06:00Pasha,
Прочитал все комменты, так в чем проблема?...Pasha,<br /><br />Прочитал все комменты, так в чем проблема? Непонятно куда запихнуть метод получения для таска связанных с ним объектов, чтоб загрузить только их и пересчитать даты (и методов в таком стиле в системе большинство)?<br /><br />Так может и ничего страшного, в том чтобы поместить такие условия запроса прямо в домен?<br />Вот копипаста из фаулера:<br />"Типовое решение хранилище SomewhereSomehowhttps://www.blogger.com/profile/03136733287610895490noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-77454351435941432272011-08-16T18:08:36.443+06:002011-08-16T18:08:36.443+06:00>> Хочу прочувствовать, каким образом
>&...>> Хочу прочувствовать, каким образом <br />>> Transaction Script здесь уделывает DDD. <br /><br />да в том то и дело, что не уделывает, просто позволяет выбирать данные более...контролируемо и безопасно. <br />Например, заранее выбрать для пересчета сразу все задачи в проекте, но в урезанном виде, с парой необходимых полей. Или заранее угадать выбираемые задачи - можно сразу выбрать Pashahttps://www.blogger.com/profile/10417730019270060101noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-27468488055655053242011-08-16T10:58:55.902+06:002011-08-16T10:58:55.902+06:00@Idsa
Спасибо за код, интересно было глянуть.@Idsa<br /><br />Спасибо за код, интересно было глянуть.Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-80539352448989138442011-08-15T23:59:03.862+06:002011-08-15T23:59:03.862+06:00@Pasha, а как реализована эта задача в Transaction...@Pasha, а как реализована эта задача в Transaction Script? Там ведь тоже нужно как-то вытаскивать задачи... Хочу прочувствовать, каким образом Transaction Script здесь уделывает DDD.Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-56983379636665739762011-08-15T17:52:48.064+06:002011-08-15T17:52:48.064+06:00Я, может быть, сейчас скапитаню... но я использую ...Я, может быть, сейчас скапитаню... но я использую Transaction Script (в том числе и для решения выше озвученных проблем) с aggregate-root-подобными сервисами. <a href="http://code.google.com/p/betteamsbattle/source/browse/trunk/Data/Data.Services/BattlesService.cs" rel="nofollow">Пример</a>. Своего рода компромисс...Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-21745510492234133922011-08-15T15:49:53.733+06:002011-08-15T15:49:53.733+06:00@xelibrion
1-2 Анализировали, искали, не нашли. П...@xelibrion <br />1-2 Анализировали, искали, не нашли. Предметная область изучена вдоль и поперек, за столько лет :(<br /><br />3. Вариант хороший, но в классе Task при этом вообще логики не остается, кроме INotifyPropertyChanged. <br />Т.е. практически берется текущий вариант с TS, и распапаллеливается. Гораздо проще написать пересчет одной рекурсивной функцией в сервисе (как сделано сейчас), чемPashahttps://www.blogger.com/profile/10417730019270060101noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-6071407762441654302011-08-13T19:58:03.759+06:002011-08-13T19:58:03.759+06:00@Александр, например, метод Proccess в этом классе...@Александр, например, метод Proccess в этом классе: http://code.google.com/p/betteamsbattle/source/browse/trunk/ScreenShotsMaker/QueuedBetUrlProcessor/QueuedBetUrlProcessor.csIdsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-20645709813986210822011-08-13T11:16:53.059+06:002011-08-13T11:16:53.059+06:00@Мурадов Мурад
нет, не идентичен@Мурадов Мурад <br />нет, не идентиченAnonymoushttps://www.blogger.com/profile/01315649357109353692noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-55580872696067656842011-08-13T02:28:04.490+06:002011-08-13T02:28:04.490+06:00@xelibrion
Разве п.3 не идентичен Lazy Load? Единс...@xelibrion<br />Разве п.3 не идентичен Lazy Load? Единственное что, он будет асинхронным. Кстати в этом случае решение есть даже при сложных и разношерстных связях между задачами.<br />@Pasha<br />Anemic domain это и есть Transaction Script.Мурадов Мурадhttps://www.blogger.com/profile/06611052686208052951noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-91867282126740589892011-08-13T00:46:04.778+06:002011-08-13T00:46:04.778+06:00Варианты следующие:
1. Провести более детальный ан...Варианты следующие:<br />1. Провести более детальный анализ требований<br />2. Искать недостающий агрегат, который будет управлять расписанием (если это приемлимо - я не знаю всех тонкостей вашего домена)<br />3. Распараллелить процесс.<br />Строго говоря, процессы изменения даты у одной задачи и у связанных с ней мало связаны и их можно делать асинхронно. Логика такая - у задачи меняется дата, Anonymoushttps://www.blogger.com/profile/01315649357109353692noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-53919533292927280342011-08-12T18:45:03.723+06:002011-08-12T18:45:03.723+06:00@Gengzu
Вы мое описание проблемы выше читали?
Ес...@Gengzu<br /><br />Вы мое описание проблемы выше читали?<br /><br />Есть проект. В проекте 2-3 тысячи задач. У задач есть иерархия и зависимости. Изменение даты начала/конца у одной задачи переводит к пересчету дат вверх/вниз по иерархии, и по зависимостям. <br /><br />Окуей, загрузил я задачу, у которой поменялась дата, без связных сущностей - и что толку? Что мне с ней делать - логика пересчетаPashahttps://www.blogger.com/profile/10417730019270060101noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-62610928809270918982011-08-12T18:29:09.530+06:002011-08-12T18:29:09.530+06:00это 5000 вложенных объектов? сделайте из них Aggre...это 5000 вложенных объектов? сделайте из них Aggregation Root и грузите отдельно. тогда необходимый объект будет чист. ну и никто не мешает загрузить его без связных сущностей, при необходимости.Gengzuhttps://www.blogger.com/profile/09036146649576331072noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-59596643764780292712011-08-12T18:23:36.865+06:002011-08-12T18:23:36.865+06:00@Gengzu
Ок, отличное решение. К сожалению, очевидн...@Gengzu<br />Ок, отличное решение. К сожалению, очевидное, естественно, опробованное и отброшенное уже давно. Т.к. моем случае грузит в память около 5000 объектов для сдвига какой-то жалкой даты. <br /><br />Есть ли нормальное решение загрузки данных не для магазина с тремя заказами, а для моего конкретного случая с задачами?Pashahttps://www.blogger.com/profile/10417730019270060101noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-20460285525208121632011-08-12T18:19:24.520+06:002011-08-12T18:19:24.520+06:00@Александр
>> У вас ORM не позволяется LL ...@Александр <br /><br />>> У вас ORM не позволяется LL делать<br />хорошая шутка :)<br /><br />сейчас практически любой ORM позволяет делать LazyLoad, не в том вопрос. <br />От LL обычно отказываются из соображений производительности/предсказуемости. LL в моем случае не спасет, наоборот - делает все еще хуже. Да, я специально проверял :(<br /><br />Посмотри мой пример выше, про задачи - там Pashahttps://www.blogger.com/profile/10417730019270060101noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-37238325127399303872011-08-12T18:17:13.086+06:002011-08-12T18:17:13.086+06:00было 2 случая - это подргузка 1 элемента с его свя...было 2 случая - это подргузка 1 элемента с его связими, и подгрузка этих элементов в виде коллекции. в последнем случае могли требоваться не все связи. либо вообще не требоваться.<br /><br />касательно других разных случаев, нужно смотреть логику.<br />возможно имеет смысл выделить больше Aggregation Root'ов. <br />но обычно, если нужна сущность, она нужна целиком.Gengzuhttps://www.blogger.com/profile/09036146649576331072noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-74099030466973143802011-08-12T17:53:53.115+06:002011-08-12T17:53:53.115+06:00@Gengzu
А если в разных случаях надо подгружать р...@Gengzu<br /><br />А если в разных случаях надо подгружать разные связанные коллекции?Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-33959036807439183952011-08-12T17:52:08.212+06:002011-08-12T17:52:08.212+06:00> И все же - есть ли нормальное решение загрузк...> И все же - есть ли нормальное решение загрузки данных<br /><br />я делал относительно просто.<br /><br />1 GenericRepository на все сущности.<br /><br />На сущность можно было навесить аттрибуты, указывающие, какие поля догружать. Репозиторий по этому аттрибуту формировал запрос с необходимыми Include. всё.Gengzuhttps://www.blogger.com/profile/09036146649576331072noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-37278191465418817742011-08-12T17:17:16.935+06:002011-08-12T17:17:16.935+06:00@Pasha
Может и есть, но я их не видел. Мы пришли ...@Pasha<br /><br />Может и есть, но я их не видел. Мы пришли к тому, что в Repository или Query создается специальный метод, который не просто берет по ID, а еще подгружает связанные коллекции.<br /><br />Ну и конечно спасает Lazy Load. У вас ORM не позволяется LL делать?Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-62835368978768202032011-08-12T17:13:54.210+06:002011-08-12T17:13:54.210+06:00@Александр
Не обратил внимания на дату топика :)
И...@Александр<br />Не обратил внимания на дату топика :)<br />И все же - есть ли нормальное решение загрузки данных при отсутсвии Lazy Load? Например, как корректно загрузить HistoryEntries в примере использования для истории №4?<br /><br />В этот раз я не троллю, мне действительно хочется увидеть решение, т.к. наболело :(Pashahttps://www.blogger.com/profile/10417730019270060101noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-37803718571334118572011-08-12T15:52:38.837+06:002011-08-12T15:52:38.837+06:00@Idsa
Можно пример хотя бы приближенный к практик...@Idsa<br /><br />Можно пример хотя бы приближенный к практике?Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-8860945628095476982011-08-12T15:50:25.045+06:002011-08-12T15:50:25.045+06:00@Александр, то есть коммит отложенный? А если мне ...@Александр, то есть коммит отложенный? А если мне нужно на каком-то этапе закоммитить UnitOfWork (например, для получения автосгенерированного Id), а потом продолжить?Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.com