Каков наилучший способ совместного использования модели для разных проектов при использовании предметно-ориентированного проектирования?

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

В этом случае, как применить дизайн, управляемый предметной областью (использовать ORM, сначала создать модель, создать схему базы данных)? Создать несколько баз данных с большим количеством одинаковых таблиц? Или как поделиться данными? Использовать синонимы? Какова возможная стратегия решения проблемы модели совместного использования (включая данные)?

Любое предложение приветствуется. Заранее спасибо!


person zs2020    schedule 02.11.2011    source источник


Ответы (2)


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

Что нам показалось интересным, так это то, что мы думали, что несколько проектов (не C# proj, а настоящие крупные проекты разработки) или называемые системами очень редко имеют одинаковую точку зрения на использование модели. Мы подумали, что в более крупной области, охватывающей несколько приложений/систем/проектов, вы можете обнаружить несколько ядер, где вы не хотите, чтобы ядра дублировались в каждом приложении.

Все закончилось доменом, который был распределен на несколько машин. И у нас были ключи GUID, чтобы связать их вместе в базе данных. Но поскольку мы сделали эту модель «сначала», поддомены смотрели друг на друга как службы, связанные с инфраструктурой, которые были доступны через события домена.

Сложный? Не совсем. Вот пример: Домен 1 (система обзора заработной платы) – у нас есть статистическая система обзора заработной платы, которая проводит оценку заработной платы сотрудников и того, как они соотносятся с их опытом, возрастом и производительностью. Ядром является форма анкеты, оценка работы, ответы на анкету, рейтинг. советы по изменению заработной платы и т. д.

Второй домен (система сотрудников). Здесь вы управляете своим сотрудником, регистрируете новых сотрудников, занимаетесь реабилитацией, возможно личным развитием, зарплатой, трудовым договором, льготами и т. д.

Третий домен (управление эффективностью). Здесь вы обрабатываете историю опыта сотрудников, цели, достижения и соглашения между начальником и сотрудниками о личном развитии, рейтинге и уровне производительности.

Как вы заметили, ядро ​​каждого домена отличается, но у них есть некоторые общие проблемы. В зависимости от развертывания, инфраструктуры и требований к тому, насколько тесно они должны относиться друг к другу/реагировать друг на друга, технология решения этой проблемы может различаться.

Я предпочитаю делать эту технологию независимой. Мы использовали NServiceBus для синхронизации домена через события домена (шаблон событий домена Уди Дана).

Например, после того, как мы завершили обзор заработной платы для сотрудника и начальника, следует сообщить, что Джо должен получить шанс на повышение заработной платы на 200-500 долларов в этом году.

Метод ApplySalaryReview для корневого агрегата объекта Employee не только сохраняет результат проверки, но также запускает событие домена NotifySalaryReviewSubscribers, которое запускает обработчик событий HandleNotifySalaryReviewSubscribersEvent на уровне приложения, который принимает инфраструктурную службу в ctor. Эта служба помещает результат в очередь сообщений, на которую могут подписаться все системы, которым нужна эта информация. В нашем случае это второй домен (система сотрудников). Система сотрудников импортирует результат и уведомляет начальника сотрудника о том, что он получил новую информацию для предстоящего разговора о зарплате с этим конкретным сотрудником.

Надеюсь, я пролил некоторый свет на один из способов сделать это. Есть и много других способов...

person Magnus Backeus    schedule 03.11.2011
comment
Пожалуйста, прокомментируйте или обсудите больше по этой теме. Я готов... :-) Поскольку это распространенный сценарий, нарисуйте свои ограниченные контексты в своем домене. - person Magnus Backeus; 03.11.2011

Возможно, вы захотите (пере)читать шаблоны стратегического проектирования в синяя книга.

person Yves Reynhout    schedule 03.11.2011
comment
Возможно, вы захотите упомянуть, какая глава специфична для него. - person zs2020; 03.11.2011
comment
Ну, я думаю, вы сможете принять обоснованное решение, только прочитав все соответствующие главы в ЧАСТИ IV (в них обсуждаются все доступные вам варианты). С моей стороны было бы несколько самонадеянно, если бы я сказал вам, какую главу читать, основываясь на вашем 6-строчном описании. - person Yves Reynhout; 03.11.2011