Учебный пример по DDD. Пример реализации

7 января 2012 г.

Почти год назад Сергей Соловьев в личной переписке по email спросил у меня, как лучше реализовать сценарий актуальный для него предметной области. Подробности в статье Учебный пример по DDD.

В комментариях шло обсуждение решения, но целый пример прислал только Степан Родионов. Его решение можно посмотреть на GitHub https://github.com/AlexanderByndyu/DDD-example-1

Если вы хотите предложить своё решение, то присылайте их в комментарии ссылками на исходный код или на свои блоги с описанием вашего подхода. Все примеры я обязательно посмотрю и напишу свои предложения по реализации. Давайте учится вместе!

45 комментариев:

  1. Может лучше куда-нибудь на гитхаб?

    ОтветитьУдалить
  2. Станислав Выщепан8 января 2012 г. в 01:42

    Там такой код, что его на github, да и вообще в интернет стыдно выкладывать.

    ОтветитьУдалить
  3. Станислав Выщепан8 января 2012 г. в 01:44

    Что-то я в представленном коде DDD не увидел. Вся работа в классе TermEnvironment, который в предметной области не фигурирует и больше похож на сервис.

    ОтветитьУдалить
  4. Станислав Выщепан9 января 2012 г. в 07:59

    http://pastebin.com/8QyKHeux 

    1) Работает с базой
    2) Есть IoC
    3) Корректно работает при множестве клиентов
    4) Не-DDD

    А теперь ваш?

    ОтветитьУдалить
  5. Да, мне казалось GitHub уже стандарт, как-то уныло кусками кода кидаться.

    ОтветитьУдалить
  6. "Учебный пример по DDD"
    >4) Не-DDD

    выглядит забавно =)

    ОтветитьУдалить
  7. Первый раз соглашусь, я тоже не особо понял, что это за класс и где он в домене (домена-то особо и не было конечно, был какой-то сценарий и "додумайте себе домен"). Это одна прооблема. Вторая, то что код не соответсвует сценарию. Предлагаю сравнить: 
    http://screencast.com/t/uRQAIeLpSDn

    Я не буду приводить здесь код, который служит "примером DDD", потому что не понимаю, как можно проиллюстрировать DDD при текущей постановке задачи. DDD это ведь не наличие проектов с названиями Domain, Infrastructure, репозиториев, onion architecture и наличие IoC . DDD это нечто большее, что сложно проиллюстрировать только кодом. Если речь идеёт об иллюстрации "архитектуры в стиле DDD", то она может быть проиллюстирована этим (уже, наверное, каноническим, но довольно устарелым с так себе кодом) примером http://dddpds.codeplex.com/SourceControl/changeset/view/62541 и уж точно классикой (для тех кто не боится Java) вот здесь http://dddsample.sourceforge.net/  Оба они не идеальны, но общее представление дают. 

    ОтветитьУдалить
  8. Выложил на GitHub https://github.com/AlexanderByndyu/DDD-example-1

    ОтветитьУдалить
  9. Спасибо за мнение и отдельно за ссылки.

    ОтветитьУдалить
  10. Вижу доменную модель. Явно автор исследовал DDD и пытался построить решение в этом ключе.
    Но увы, само решение не совершенно, так как прослеживается слишком тесная зависимость с одном конкретным хранилищем данным. Замени его на XML файл или сервис, и оно уже не работет. 
    имхо, оценка 2+.

    ОтветитьУдалить
  11. Станислав Выщепан10 января 2012 г. в 02:12

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

    ОтветитьУдалить
  12. Станислав Выщепан10 января 2012 г. в 02:13

    Кстати, где ты там DDD увидел?

    ОтветитьУдалить
  13. Ым, а с чего, простите, ржете то? Есть сложности написания кода который корректно работает с разными хранилищами?

    ОтветитьУдалить
  14. Станислав Выщепан10 января 2012 г. в 02:21

    Именно. Как например сделаете транзакционность при измении группы записей в XML? Задача прмиерно такая: надо проанализировать сущность типа А и в зависимости от нее создать сущность типа B. Без serializable уровня изоляции такое хрен сделаешь.

    ОтветитьУдалить
  15. Станислав Выщепан10 января 2012 г. в 02:21

    В смысле чтобы хранилише было с согласованном состоянии.

    ОтветитьУдалить
  16. Если очень захотеть можно и шуроповертом гвоздь забить. Так что, в Вашем случае пожалуй займусь версионностью файлов или In Memory Transaction или еще каким извратом. Но в любом случае это не скажется на коде потребителе, т.е. весь код использующий I%Repository, IUnitOfWork и IUnitOfWorkFactory останется неизменным.А какой изврат будет скрываться за ними это уже детали реализации.

    ОтветитьУдалить
  17. данные устаревают на момент отображения. о какой согласованности идет речь? решать конфликты придется в любом случае.

    ОтветитьУдалить
  18. Нет, вопрос был достаточно корректный с точки зрения домена и DAL-a. Завязка на Wcf транзакции имхо тоже не лучшее решение :) С тем же Wcf проще хранить в контексте операции экземпляр UoW.

    ОтветитьУдалить
  19. Станислав Выщепан10 января 2012 г. в 02:41

    А я не про момент отображения. А про то что ктонить может добавить еще запись Term c IsPending = true. В базе решается транзакциями. А в XML как? А в веб-сервисе? А еще интереснее если у нас анализируемая сущность одного типа, а записываемая другого.

    ОтветитьУдалить
  20. Станислав Выщепан10 января 2012 г. в 02:42

    Где именно? Какая часть кода соотвествует каким канонам DDD?

    ОтветитьУдалить
  21. Станислав Выщепан10 января 2012 г. в 02:43

    Человек все знает, а вот вы похоже не понимаете какие проблемы несет сценарий select-insert.

    ОтветитьУдалить
  22. давайте лучше разберемся какая не соответствует

    ОтветитьУдалить
  23. да, это то понятно. просто у человека не существует решений за пределами выбранной им базы данных. все остальные способы решение ему не под силу. 

    ОтветитьУдалить
  24. Станислав Выщепан10 января 2012 г. в 02:49

    Ок, вы про себя выберите что не соотвествует, а потом оставшееся приведите и напишите почему соотвествует.

    ОтветитьУдалить
  25. так вот вам и предоставляется возможность написать готовое решение. но увы, в отрыве от привычной вам базы данных, которая не везде есть, решить данную задачу вы не в состоянии.

    ОтветитьУдалить
  26. увы. я уже сказал что соответствует. лишних доказательств это не требует. хотите оспорить? вперед.

    ОтветитьУдалить
  27. Станислав Выщепан10 января 2012 г. в 02:53

    Ржунимагу еще раз. А с чего такой вывод про "не в состоянии"? Я могу сказать что вы вообще не в состоянии писатьпрограммы, ибо я вашего кода еще не видел. Я бы на вашем месте поосторожнее словами кидался ;)

    ОтветитьУдалить
  28. Станислав Выщепан10 января 2012 г. в 02:54

    Тут не то что лишних, тут вообще никаких не было. Я вот скажу что ваш образ мылси не соотвествует АБВГД и вооще на 2 с минусом.

    ОтветитьУдалить
  29. Господа, вы еще метриками померяйтесь :)

    ОтветитьУдалить
  30. да пожалуйста :) это ваши половые проблемы :)

    ОтветитьУдалить
  31. а разве я тут что-то утверждал? типа могу или не могу? xD

    ОтветитьУдалить
  32. Станислав Выщепан10 января 2012 г. в 03:03

    Я просто прикалываюсь с далекоидущих выводов недалеких товарищей.

    ОтветитьУдалить
  33. ооо, этот вывод очень легко напрашивается глядя на все примеры вашего кода, который в отрыве от DbContext совершенно не дееспособен. 

    ОтветитьУдалить
  34. Станислав Выщепан10 января 2012 г. в 03:14

    Данивопрос. Присылайте свой код, который "дееспособен".

    ОтветитьУдалить
  35. А зачем вы противоречите автору? Он же написал, что это "не DDD" (хотя правильнее не архитектура в стиле DDD), врядли он пытался построить решение в этом ключе.

    Помимо этого, ваше заявление по поводу тесной зависимости очень спорно. Полностью отвязаться от деталей хранилища можно далеко не всегда и что более важно _нужно_ далеко не всегда. Если нет такого требования, то зачем писать лишний код и лишние уровни абстракции? Когда это событие произойдёт (потребность перехода на другое хранилище), то отрефакторить код будет проще (при правильном использовании DI), чем поддерживать лишние уровни абстракции на протяжении всей жизни проекта. 

    ОтветитьУдалить
  36. Слив засчитан. И хамить не надо.

    ОтветитьУдалить
  37. неужели вы думаете что меня интересует мнение какого-то анонимуса?

    ОтветитьУдалить
  38. Твое мнение здесь никого также не интересует. Ты уже достаточно сказал для того, чтобы в этом убедиться ))

    ОтветитьУдалить
  39. Выложите, пожалуйста, код, который компилируется.

    Пример, который мне нравится, я выложил, ссылка в тексте поста. Там проект в VS2010, который компилируется и запускается. 

    ОтветитьУдалить
  40. Нашел интересный пример по DDD. Во всяком случае предложенный код имеет достаточное совпадение с моей реализацией :)
    http://code.google.com/p/ndddsample/
    На пример вышел из статьи http://habrahabr.ru/blogs/net/61524/

    ОтветитьУдалить
  41. Станислав Выщепан12 января 2012 г. в 21:31

    https://skydrive.live.com/redir.aspx?cid=e74e2842a8a54dc1&resid=E74E2842A8A54DC1!582&parid=E74E2842A8A54DC1!117&authkey=!APbvW-G4i7LIdj8

    ОтветитьУдалить
  42. Станислав Выщепан12 января 2012 г. в 21:33

    А чем он нравится? Он и не DDD по сути, там TermEnvironment - непонятно что и в предметной области такого нет. С реальным хранилищем код не работает, группирование классов такое что плакать хочется.

    ОтветитьУдалить
  43. Спасибо за ссылку

    ОтветитьУдалить

Моя книга «Антихрупкость в IT»

Как достигать результатов в IT-проектах в условиях неопределённости. Подробнее...