当底层数据库具有关系时,系统从另一个系统使用WCF服务

时间:2011-06-17 15:15:14

标签: wcf nhibernate architecture domain-driven-design soa

这是我在许多系统中遇到过的问题,但这个问题就是一个很好的例子。它与一个系统从另一个系统使用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原则,以及所有这些原则。

我情不自禁地觉得我在这里犯错了,错过了一些简单的事情。

2 个答案:

答案 0 :(得分:2)

我建议您在此处应用CQRS和事件驱动架构原则

    • 使用Guids作为主键 - 然后你 将能够生成主键 对于文档并将其传递给WCF
      方法调用。
    • 在WCF服务的另一端使用消息传递以防止数据丢失 (如果数据库出现故障,请联系 类似的东西)。
    • 删除数据库之间的constaints - immediate consistent应用程序没有 规模。使用eventual consistency 相反,范式。
  1. 为其引入单独的数据存储     读取包含非规范化数据的目的。那你就可以了     做搜索非常容易。确保     读取存储的一致性(in     创建Document时的情况     失败了你可以实现一些     简单的工作流程(saga就此而言     CQRS)

答案 1 :(得分:0)

您可以创建一个公共代码库,其中包括Document的基本实现以及所有映射,基本域模型等。

文档服务和HR系统使用相同的代码库。但是在HR系统中,您可以使用继承映射策略使用HRDocument扩展基础Document类(或多个类),这将最适合您的需求。

public class HRDocument : Document 

从人力资源系统,你甚至不用再打电话给文件服务了,你只需要使用NH并享受ACID等等。但文档服务仍然存在,并且没有代码重复。