这是我在许多系统中遇到过的问题,但这个问题就是一个很好的例子。它与一个系统从另一个系统使用WCF服务,每个系统都有自己的数据库有关,但两个数据库之间存在关系。
我们有一个中央数据库,其中包含公司所有文档的记录。此数据库包括文档和文件夹表,它模仿Windows文件结构。 NHibernate处理数据访问,域层处理逻辑(验证文件名/在同一文件夹中没有相同的文件名等),服务层位于其上,服务名为'CreateDocument(bytes [])','RenameDocument(id) ,newName)','SearchDocuments(filename,filesize,createdDate)'等。这些服务通过WCF公开。
人力资源系统会消耗这些服务。 HR数据库有一个单独的数据库,该数据库具有Document数据库的外键:它包含一个HRDocument表,该表具有外键DocumentId,然后是HR特定的,如EmployeeId和ContractId。
以下是其他问题:
1)为了保存文档,我必须调用WCF服务将其保存到中央数据库,返回ID,然后保存到HRDocument表(以及HR特定信息)。由于WCF调用和所有特定于文档的数据访问都是在文档应用程序中完成的,因此无法在一个事务中完成所有操作,从而可能导致事务完整性丢失。
2)为了搜索say,employeeId和createdDate,我必须调用传入createdDate(文档数据库特定字段)的搜索服务,然后在返回记录的Id上搜索HRDocument数据库以过滤结果回。这感觉凌乱,缓慢而且错误。
我可以将NHibernate映射文件复制到HR应用程序的DAL中的Document数据库。这意味着我可以指定HRDocument和Document之间的关系。这意味着我可以加入表格并进行搜索,但这也意味着我必须复制域逻辑并违反DRY原则,以及所有这些原则。
我情不自禁地觉得我在这里犯错了,错过了一些简单的事情。
答案 0 :(得分:2)
我建议您在此处应用CQRS和事件驱动架构原则
为其引入单独的数据存储
读取包含非规范化数据的目的。那你就可以了
做搜索非常容易。确保
读取存储的一致性(in
创建Document
时的情况
失败了你可以实现一些
简单的工作流程(saga就此而言
CQRS)
答案 1 :(得分:0)
您可以创建一个公共代码库,其中包括Document的基本实现以及所有映射,基本域模型等。
文档服务和HR系统使用相同的代码库。但是在HR系统中,您可以使用继承映射策略使用HRDocument扩展基础Document类(或多个类),这将最适合您的需求。
public class HRDocument : Document
从人力资源系统,你甚至不用再打电话给文件服务了,你只需要使用NH并享受ACID等等。但文档服务仍然存在,并且没有代码重复。