tag:blogger.com,1999:blog-458002489272917533.post1652301080558054291..comments2024-02-14T14:07:38.890+05:00Comments on Блог Александра Бындю: Учебный пример по DDDAlexander Byndyuhttp://www.blogger.com/profile/14185486842573956085noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-458002489272917533.post-7969288596974271552012-09-24T19:02:56.516+06:002012-09-24T19:02:56.516+06:00 Придумал такое http://pastebin.com/aKGSiFxD , нез... Придумал такое http://pastebin.com/aKGSiFxD , незнаю на сколько адекватно.Artem Kovalevnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-85722920729881558922012-09-19T23:11:23.068+06:002012-09-19T23:11:23.068+06:00Изучаю DDD. Не могу придумать как правильно реализ...Изучаю DDD. Не могу придумать как правильно реализовать следующие правила. <br /><br /><br />Имеются 3 роли: Админ, модератор, прользователь.<br />Имеется Анкета. <br />Данные в анкете могут редактировать только пользователи Администраторы и Модераторы прикрепленые к анкете. Так же в системе существуют обычне пользователи которые не могут редактировать анкеты, но просмотривать информацию из них Artem Kovalevnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-91987116251392696552011-01-25T22:01:58.671+05:002011-01-25T22:01:58.671+05:00@Сергей Соловьев
заказчики не изъясняются в назван...@Сергей Соловьев<br />заказчики не изъясняются в названиях классов и их свойствах. В их пониманиях есть срок (или какой-то период времени), есть понимание о категориях пользователей, которые могут выполнять определенные операции. В общем они изъясняются в терминах предметной области, а не программирования. Соответственно я бы хотел видеть задачу, описанную именно в терминах предметной области.Anonymoushttps://www.blogger.com/profile/01315649357109353692noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-88901430829006361842011-01-25T13:17:26.726+05:002011-01-25T13:17:26.726+05:00Спасибо всем за ответы, особенно @hazzik: его вари...Спасибо всем за ответы, особенно @hazzik: его вариант мне понравился больше всего. Вопросы:<br />1) В какой точке текущее состояние доменных объектов будет сохранятся в базу? Какой-то сервис, в который инжектируется репозиторий?<br />2) Допустим предполагается, что на уровне базы не будет таблице Users, таким образом, сущность "User", если так можно выразиться, чисто доменная. Вся Сергей Соловьевhttps://www.blogger.com/profile/05604885814305092026noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-35162937075363000462011-01-25T11:33:26.915+05:002011-01-25T11:33:26.915+05:00На самом деле @hazzik прав - задача сформулирована...На самом деле @hazzik прав - задача сформулирована некорректно. С точки зрения DDD важно понимать предметную область, однако в данном примере это довольно затруднительно сделать. Мое решение было основано на том, что Term - это aggregation root, однако с точки зрения бизнеса это вполне может быть не так.Anonymoushttps://www.blogger.com/profile/01315649357109353692noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-77674332371152055302011-01-25T09:04:45.443+05:002011-01-25T09:04:45.443+05:00@hazzik
Ну ты же предложил свое решение :) Пусть...@hazzik <br /><br />Ну ты же предложил <b>свое</b> решение :) Пусть другие тоже попробуют.Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-16676331907863931122011-01-25T01:49:26.909+05:002011-01-25T01:49:26.909+05:00@Александр Бындю, нет смысла решать эту задачу, т....@Александр Бындю, нет смысла решать эту задачу, т.к. она уже решена автором. Большинство в своем решении будет опираться на решение, описанное в самой задаче, при этом наследуя все его ошибки.hazzikhttps://www.blogger.com/profile/02278053558276208312noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-42539197871983058772011-01-24T20:49:16.459+05:002011-01-24T20:49:16.459+05:00@Александр Бындю: ну, тогда можно что бы Close сам...@Александр Бындю: ну, тогда можно что бы Close сам возвращал новый объект Term. тогда мы не сможем создать новый не закрыв старый, и наоборот.<br />другое дело сохранит их кто-то после этого, или нет. а может сохранит но какой-то один из них...)Gengzuhttps://www.blogger.com/profile/09036146649576331072noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-67586586021697827372011-01-24T20:02:40.149+05:002011-01-24T20:02:40.149+05:00@Gengzu
А если вызвать метод Close без вызова соз...@Gengzu<br /><br />А если вызвать метод Close без вызова создания нового периода?<br /><br />> лучше в Google Code наверное. или тот же pastebin.com. нагляднее<br /><br />Там целые солюшены с несколькими проектами, в pastebin.com будет не очень. Да, я видимо в Google Code выложу.Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-50689330515381396962011-01-24T19:44:49.357+05:002011-01-24T19:44:49.357+05:00Наверное сделал бы как-то так)
http://pastebin.co...Наверное сделал бы как-то так)<br /><br />http://pastebin.com/yUxkYwFi<br /><br />Вероятней всего, если менеджер и модель лежит в одной сборке, отдельно от остального проекта, то конструктор и метод Close можно сделать internal, так как снаружи этот функционал вроди как не нужен.<br /><br />ЗЫ: @Александр Бындю: лучше в Google Code наверное. или тот же pastebin.com. нагляднее.Gengzuhttps://www.blogger.com/profile/09036146649576331072noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-17719939169135754542011-01-24T17:53:43.814+05:002011-01-24T17:53:43.814+05:00Куда будет лучше выложить код, который присылают н...Куда будет лучше выложить код, который присылают на почту?<br /><br />Я могу, например, на Google Code в свой SVN.Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-78888901962059516992011-01-24T15:37:15.520+05:002011-01-24T15:37:15.520+05:001. Допустим у пользователя (User) есть ссылка на т...1. Допустим у пользователя (User) есть ссылка на текущий период (Term):<br /><br />partial class User { public Term CurrentTerm {get; private set; }}<br /><br />Тогда отпадает необходимость в поле IsPending и инжекции репозитория куда-либо.<br /><br />2. Допустим у пользователя есть коллекция предыдущих периодов:<br /><br />partial class User { <br />private ICollection{Term} previousTerms;<br />hazzikhttps://www.blogger.com/profile/02278053558276208312noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-72065251740161249562011-01-23T23:54:13.708+05:002011-01-23T23:54:13.708+05:00Без бизнес-аналиста сложно чето сказать. Но я бы н...Без бизнес-аналиста сложно чето сказать. Но я бы начал с того что над Term надо чето выше. Предположим что это будет UserTerms (оно теперь и будет рут аггрегатом), соотвевенно проперти CurrentTerm, OldTerms. Метод Start будет у UserTerms, вся инфа у него теперь есть.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-33686007644276633832011-01-23T16:34:50.599+05:002011-01-23T16:34:50.599+05:001. Да, exception
2. В entity ничего инжектировать ...1. Да, exception<br />2. В entity ничего инжектировать нельзя! Если у вас появляется желание это сделать - это значит что вы что-то делаете неправильно. В данном случае старт нового периода - это cross-cutting concern. Иными словами - операция, которая затрагивает несколько aggregation roots. Что в свою очередь означает, что обработку этой операции необходимо вынести из домена. Как именно это Anonymoushttps://www.blogger.com/profile/01315649357109353692noreply@blogger.com