架构两个独立数据库的最佳方法?

Zac*_*ack 8 architecture integration database-design facade entity-framework-4

我在工作中遇到了以下问题,而且我没有经验或知识来回答它们,我希望你们中的一些人能够指出我正确的方向,任何答案将不胜感激!

脚本

我们有两个方面的业务使用单独的数据库,人力资源和业务领域(家庭护理).
人力资源部门跟踪公司的员工,轮班模式,缺勤,薪酬等.Homecare会跟踪客户信息,家访,访问日期以及负责提供访问的员工.

这两个系统是分开的,我们目前正在寻找集成它们的方法.

此外,我们正在研究如何将查看这两个数据库的代码组织成可重用,有组织的库.

我们有三个应用程序重用HumanResources.dll,负责与库中包含的EF 4对象上下文进行通信.对象上下文几乎是数据库的镜像.

问题


我们即将添加第四个将使用HR数据库中的数据的应用程序.

我们要不要:

创建一个新的EF数据模型,负责提供只有应用程序需要的信息,同时复制一些常见的实体,如Employee.

要么

将新实体/表添加到已经很大的模型中并接受它将变大.


从长远来看,我们需要将人力资源数据库中的班次模式信息加入第5个应用程序中的操作区域(家庭护理)数据库中的客户访问.

我们已经了解了我们能做些什么; 我们提出以下建议:

创建一个位于HumanResources对象上下文和Homecare对象上下文之间的层,负责将两组数据连接在一起.

还有其他方法可以使我们受益吗?

sma*_*man 12

实现Facade模式

外观基本上是复杂子系统的适配器.由于您有两个子系统,我建议创建三个具有以下功能的类:

  1. HumanResourcesFacade:包含所有"人力资源"功能的类.此类的工作是公开执行人力资源应用程序负责的每个工作单元的方法,而不向客户端公开有关人力资源应用程序的任何信息.

  2. HomecareFacade:包含所有"Homecare"功能的课程.此类的工作是公开执行Homecare应用程序负责的每个工作单元的方法,而不向客户公开有关Homecare数据库的任何信息.

  3. ApplicationFacade:一个包装既类HumanResourcesFacadeHomecareFacade提供公共方法给您的客户不需要的任何两个嵌套外墙的内部运作的知识.这个类的工作是知道:(a)两个嵌套外观中的哪一个负责每个客户端调用,(b)通过调用嵌套Facade上的适当方法来执行客户端对ApplicationFacade的调用,并且( c)将从嵌套外观接收的数据转换为客户端可用的格式,而不依赖于嵌套外观的数据格式.

我建议使用POCO对象模型来创建不依赖于实际持久性实现的数据的公共代码表示.Adrian K建议的领域模型技术是一种很好的方法,但是如果你不熟悉模式和方法,最终可能会比非常直观的技术更加混乱和花费更长的时间.另一种方法是使用数据对象和数据映射器.数据映射器基本上从数据源获取数据并将其转换为不依赖于数据源或映射器对象的对象.我在下面添加了一个链接.

我想澄清的一点是,虽然我说ApplicationFacade有三份工作,但我并不是说你违反了单一责任原则.我并不是说该类本身需要完成所有这三件事,而是它应该封装您决定用于执行该过程的任何机制,并且应用程序的其他任何部分都不应该从外部访问这些问题ApplicationFacade.例如,您的业务对象不应该知道它们是从哪个数据源构造的 - 该信息不应该从除了ApplicationFacade类所封装的内容之外的任何地方访问.

参考文章