Почти год назад Сергей Соловьев в личной переписке по email спросил у меня, как лучше реализовать сценарий актуальный для него предметной области. Подробности в статье Учебный пример по DDD.
В комментариях шло обсуждение решения, но целый пример прислал только Степан Родионов. Его решение можно посмотреть на GitHub https://github.com/AlexanderByndyu/DDD-example-1
Если вы хотите предложить своё решение, то присылайте их в комментарии ссылками на исходный код или на свои блоги с описанием вашего подхода. Все примеры я обязательно посмотрю и напишу свои предложения по реализации. Давайте учится вместе!
Может лучше куда-нибудь на гитхаб?
ОтветитьУдалитьТам такой код, что его на github, да и вообще в интернет стыдно выкладывать.
ОтветитьУдалитьЧто-то я в представленном коде DDD не увидел. Вся работа в классе TermEnvironment, который в предметной области не фигурирует и больше похож на сервис.
ОтветитьУдалитьВаш вариант?
ОтветитьУдалитьhttp://pastebin.com/8QyKHeux
ОтветитьУдалить1) Работает с базой
2) Есть IoC
3) Корректно работает при множестве клиентов
4) Не-DDD
А теперь ваш?
Да, мне казалось GitHub уже стандарт, как-то уныло кусками кода кидаться.
ОтветитьУдалить"Учебный пример по DDD"
ОтветитьУдалить>4) Не-DDD
выглядит забавно =)
Первый раз соглашусь, я тоже не особо понял, что это за класс и где он в домене (домена-то особо и не было конечно, был какой-то сценарий и "додумайте себе домен"). Это одна прооблема. Вторая, то что код не соответсвует сценарию. Предлагаю сравнить:
ОтветитьУдалить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/ Оба они не идеальны, но общее представление дают.
Выложил на GitHub https://github.com/AlexanderByndyu/DDD-example-1
ОтветитьУдалитьСпасибо за мнение и отдельно за ссылки.
ОтветитьУдалитьВижу доменную модель. Явно автор исследовал DDD и пытался построить решение в этом ключе.
ОтветитьУдалитьНо увы, само решение не совершенно, так как прослеживается слишком тесная зависимость с одном конкретным хранилищем данным. Замени его на XML файл или сервис, и оно уже не работет.
имхо, оценка 2+.
Ржунимагу. Я предложу тебе написать код, который продолжает оставаться корректным для техже предусловий и в нем легко заменить базу на файл или сервис.
ОтветитьУдалитьКстати, где ты там DDD увидел?
ОтветитьУдалитьЫм, а с чего, простите, ржете то? Есть сложности написания кода который корректно работает с разными хранилищами?
ОтветитьУдалитьИменно. Как например сделаете транзакционность при измении группы записей в XML? Задача прмиерно такая: надо проанализировать сущность типа А и в зависимости от нее создать сущность типа B. Без serializable уровня изоляции такое хрен сделаешь.
ОтветитьУдалитьВ смысле чтобы хранилише было с согласованном состоянии.
ОтветитьУдалитьЕсли очень захотеть можно и шуроповертом гвоздь забить. Так что, в Вашем случае пожалуй займусь версионностью файлов или In Memory Transaction или еще каким извратом. Но в любом случае это не скажется на коде потребителе, т.е. весь код использующий I%Repository, IUnitOfWork и IUnitOfWorkFactory останется неизменным.А какой изврат будет скрываться за ними это уже детали реализации.
ОтветитьУдалитьданные устаревают на момент отображения. о какой согласованности идет речь? решать конфликты придется в любом случае.
ОтветитьУдалитьтам, в коде.
ОтветитьУдалитьНет, вопрос был достаточно корректный с точки зрения домена и DAL-a. Завязка на Wcf транзакции имхо тоже не лучшее решение :) С тем же Wcf проще хранить в контексте операции экземпляр UoW.
ОтветитьУдалитьА я не про момент отображения. А про то что ктонить может добавить еще запись Term c IsPending = true. В базе решается транзакциями. А в XML как? А в веб-сервисе? А еще интереснее если у нас анализируемая сущность одного типа, а записываемая другого.
ОтветитьУдалитьГде именно? Какая часть кода соотвествует каким канонам DDD?
ОтветитьУдалитьЧеловек все знает, а вот вы похоже не понимаете какие проблемы несет сценарий select-insert.
ОтветитьУдалитьдавайте лучше разберемся какая не соответствует
ОтветитьУдалитьда, это то понятно. просто у человека не существует решений за пределами выбранной им базы данных. все остальные способы решение ему не под силу.
ОтветитьУдалитьОк, вы про себя выберите что не соотвествует, а потом оставшееся приведите и напишите почему соотвествует.
ОтветитьУдалитьтак вот вам и предоставляется возможность написать готовое решение. но увы, в отрыве от привычной вам базы данных, которая не везде есть, решить данную задачу вы не в состоянии.
ОтветитьУдалитьувы. я уже сказал что соответствует. лишних доказательств это не требует. хотите оспорить? вперед.
ОтветитьУдалитьРжунимагу еще раз. А с чего такой вывод про "не в состоянии"? Я могу сказать что вы вообще не в состоянии писатьпрограммы, ибо я вашего кода еще не видел. Я бы на вашем месте поосторожнее словами кидался ;)
ОтветитьУдалитьТут не то что лишних, тут вообще никаких не было. Я вот скажу что ваш образ мылси не соотвествует АБВГД и вооще на 2 с минусом.
ОтветитьУдалитьГоспода, вы еще метриками померяйтесь :)
ОтветитьУдалитьда пожалуйста :) это ваши половые проблемы :)
ОтветитьУдалитьа разве я тут что-то утверждал? типа могу или не могу? xD
ОтветитьУдалитьЯ просто прикалываюсь с далекоидущих выводов недалеких товарищей.
ОтветитьУдалитьооо, этот вывод очень легко напрашивается глядя на все примеры вашего кода, который в отрыве от DbContext совершенно не дееспособен.
ОтветитьУдалитьДанивопрос. Присылайте свой код, который "дееспособен".
ОтветитьУдалитьА зачем вы противоречите автору? Он же написал, что это "не DDD" (хотя правильнее не архитектура в стиле DDD), врядли он пытался построить решение в этом ключе.
ОтветитьУдалитьПомимо этого, ваше заявление по поводу тесной зависимости очень спорно. Полностью отвязаться от деталей хранилища можно далеко не всегда и что более важно _нужно_ далеко не всегда. Если нет такого требования, то зачем писать лишний код и лишние уровни абстракции? Когда это событие произойдёт (потребность перехода на другое хранилище), то отрефакторить код будет проще (при правильном использовании DI), чем поддерживать лишние уровни абстракции на протяжении всей жизни проекта.
Слив засчитан. И хамить не надо.
ОтветитьУдалитьнеужели вы думаете что меня интересует мнение какого-то анонимуса?
ОтветитьУдалитьТвое мнение здесь никого также не интересует. Ты уже достаточно сказал для того, чтобы в этом убедиться ))
ОтветитьУдалитьВыложите, пожалуйста, код, который компилируется.
ОтветитьУдалитьПример, который мне нравится, я выложил, ссылка в тексте поста. Там проект в VS2010, который компилируется и запускается.
Нашел интересный пример по DDD. Во всяком случае предложенный код имеет достаточное совпадение с моей реализацией :)
ОтветитьУдалитьhttp://code.google.com/p/ndddsample/
На пример вышел из статьи http://habrahabr.ru/blogs/net/61524/
https://skydrive.live.com/redir.aspx?cid=e74e2842a8a54dc1&resid=E74E2842A8A54DC1!582&parid=E74E2842A8A54DC1!117&authkey=!APbvW-G4i7LIdj8
ОтветитьУдалитьА чем он нравится? Он и не DDD по сути, там TermEnvironment - непонятно что и в предметной области такого нет. С реальным хранилищем код не работает, группирование классов такое что плакать хочется.
ОтветитьУдалитьСпасибо за ссылку
ОтветитьУдалить