Система, потребляющая сервисы WCF из другой системы, когда базовые базы данных имеют отношения - PullRequest
2 голосов
/ 17 июня 2011

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

У нас есть центральная база данных, в которой хранятся записи всех документов компании. Эта база данных включает таблицы документов и папок и имитирует структуру файлов Windows. NHibernate заботится о доступе к данным, уровень домена обрабатывает логику (проверяет имена файлов / нет идентичных имен файлов в одной и той же папке и т. Д.), И на этом размещается уровень служб со службами с именем «CreateDocument (bytes [])», «RenameDocument (id»). , newName) ',' SearchDocuments (имя файла, размер файла, createDate) 'и т. д. Эти службы предоставляются с помощью WCF.

Система HR использует эти услуги. База данных HR имеет отдельную базу данных, имеющую внешние ключи к базе данных Document: она содержит таблицу HRDocument, которая имеет внешний ключ DocumentId, а затем специфичный для HR, такой как EmployeeId и ContractId.

Вот проблемы среди других:

1) Чтобы сохранить документ, мне нужно позвонить в службу WCF, чтобы сохранить его в центральной базе данных, вернуть идентификатор и затем сохранить его в таблице HRDocument (вместе с информацией о персонале). Из-за того, что вызов WCF и весь доступ к данным, относящимся к конкретному документу, выполняются в приложении Document, все это невозможно сделать за одну транзакцию, что может привести к возможной потере целостности транзакции.

2) Чтобы выполнить поиск, скажем, employeeId и creationDate, мне нужно вызвать службу поиска, передав в createDate (специфичные для базы данных поля), а затем выполнить поиск в базе данных HRDocument по идентификаторам возвращаемых записей, чтобы отфильтровать результаты. вернулся. Это кажется грязным, медленным и просто неправильным.

Я мог бы продублировать файлы сопоставления NHibernate в базе данных документов в DAL приложения HR. Это означает, что я мог бы указать отношения между HRDocument и Document. Это означает, что я мог бы присоединиться к таблицам и выполнять поиск таким образом, но это также означало бы, что мне пришлось бы дублировать доменную логику и нарушать принцип СУХОГО, и все это влечет за собой.

Я не могу не чувствовать, что я делаю что-то здесь не так и упустил что-то простое.

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Я рекомендую вам применить CQRS и принципы Event Driven Architecture здесь

    • Использовать Guides в качестве первичных ключей - тогда вы сможете генерировать первичныеключ для документа и передать его в вызов метода WCF
      .
    • Используйте обмен сообщениями на другой стороне службы WCF для предотвращения потери данных (в случае сбоя базы данных и
      что-то подобное).
    • Удаление содержимого между базами данных - немедленное согласование приложения не масштабируются.Вместо этого используйте возможную согласованность парадигму.
  1. Введение отдельного хранилища данных для целей чтения, содержащего денормализованные данные.Тогда вы сможете делать поиск очень легко.Чтобы обеспечить согласованность в вашем хранилище для чтения (в случае, если создание Document не удалось), вы можете реализовать простой процесс ( saga в терминах CQRS)

0 голосов
/ 17 июня 2011

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

Служба документов и система управления персоналом используют одну и ту же кодовую базу.Но в HR System вы расширяете базовый класс (или классы) Document с помощью HRDocument, используя стратегию отображения наследования, которая наилучшим образом соответствует вашим потребностям.

public class HRDocument : Document 

А из HR System вам даже не нужно вызывать DocumentСервис больше, вы просто используете NH и наслаждаетесь ACID и все такое.Но Служба Документов все еще там, и нет дублирования кода.

...