管理界面,用于管理两个相关的数据源

时间:2009-12-17 13:55:16

标签: web-services nhibernate domain-driven-design

在项目中有两个数据源:一个是项目自己的数据库,另一个是(半)遗留Web服务。问题是管理员必须让他们保持同步并管理两者,以便用户不必知道他们是分开的(或者,知道,但他们不关心)。

这是一个例子:有语言列表。这两个应用程序 - 项目和遗留 - 都需要使用它们。但是,它们都增加了自己的含义。例如,项目可能需要活动/非活动,而遗留将需要语言代码。

但是管理员必须管理一切 - 语言名称,活动/非活动,语言代码。加载时,必须合并和显示来自两个系统的数据,并且在保存时,必须在两个系统中更新数据。

因此,表示这些分离数据(在管理页面中使用)的最佳方法是什么?请注意,我使用的是ASP.NET MVC / NHibernate。

  1. 如何管理旧数据?
    • 我是否将管理部分连接到旧的Web服务外部接口 - 它目前只有GetXXX()方法 - 并添加错过的C [R] UD方法?
    • 或者,我是否直接连接到旧数据库 - 这是可能的,因为我可以控制它。
  2. 我在哪里进行数据的拆分/合并 - 在控制器/服务层或存储库/数据层?
    • 在控制器层,我会做“var viewmodel = new ViewModel {MyData = ...,LegacyData = ...};问题 - 代码与传统问题混杂在一起。
    • 在数据层中,我将执行“var model = repository.Get(id)”,模型将包含来自两个世界的数据,当我执行“repository.Save(entity)时“它将更新两个数据源 - 在本地数据库中只存储项目特定字段。问题:a)可能的漏洞抽象b)从Web服务获取数据总是只需要有时候,通常仅用于管理部分
      • 修改,使用ICombinedRepository< Language>这将提供额外的拆分/合并。问题:仍然需要新模型或IWithLegacy< Language,LegacyLanguage> ...
  3. 有一个“同步”方法;这将删除项目项目列表中不存在的旧项目,更新存在的项目,创建遗漏的旧项目等...
  4. 好吧,总结一下主要问题:

    • 我是在Web服务上开发CRUD接口还是直接连接到它的数据库(这是我完全控制的,所以我甚至可能以后决定将该Web服务部分移动到主应用程序中或使其使用主数据库) ?
    • 我是否有单独的项目和遗留实体类,因此需要单独管理,或者项目实体是否具有所有遗留字段,在保存/加载时是否透明管理?

    无论如何,是否有任何关于管理来自不同来源的重复数据的有用提示?什么是最佳实践?

    在非管理部分,我想完全隐藏遗留数据的概念。这就是我现在在存储库接口后面做的事情。但对于管理员来说,这不是那么清楚或容易......

1 个答案:

答案 0 :(得分:1)

您在此处描述的内容似乎需要一个反腐败层。您可以在此处找到与此主题相关的解决方案:DDD, Anti Corruption layer, how-to?

当你有两个概念上的有界上下文,但你只为其中一个使用DDD时,Anti-Corruption层就会发挥作用。当读取数据源(执行获取操作[R])时,反腐败层会将您的旧数据转换为项目的可用对象。当写入您的数据源(执行设置操作[CUD])时,反腐败层会将您的DDD对象转换为旧代码所理解的对象。

是否使用现有Web服务取决于您是否愿意更改现有代码。坚持DRY实践,您不希望复制已有的内容。如果要保留Web Service,可以在反腐败层中添加CUD方法,而不会影响旧版应用程序。

在反腐败层中,您将需要使用适配器和外观将DDD项目和遗留应用程序的单独类组合在一起。

反腐败层正是您处理拆分和合并的地方。

如果您对此有任何疑问,请告诉我,因为它可能是一个有点高级的主题。我会尽力回答。

祝你好运!