2009-12-17 40 views
0

该项目中有两个数据源:一个是项目自己的数据库,另一个是(半)旧式Web服务。问题在于管理员必须保持同步并管理两者,以便用户不必知道他们是单独的(或者知道,但他们不在意)。用于管理两个相关数据源的管理界面

下面是一个例子:有语言列表。这两个应用程序 - 项目和传统 - 都需要使用它们。但是,他们都添加了自己的意思。例如,项目可能需要激活/不激活,而遗产将需要语言代码。

但管理部分必须管理所有内容 - 语言名称,活动/不活动,语言代码。加载时,两个系统的数据必须合并并显示,并且保存时,必须在两个系统中更新数据。

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

  1. 如何管理遗留数据?
    • 我是否将管理部分连接到遗留Web服务外部接口 - 目前它只有GetXXX()方法 - 并添加了错过的C [UD]方法?
    • 或者,我直接连接到遗留数据库 - 这是可能的,因为我确实控制它。
  2. 我该怎么做数据拆分/合并 - 在控制器/服务层,还是在存储库/数据层?
    • 在控制器层我会做“VAR视图模型=新的视图模型{迈德特= ...,LegacyData = ...};问题 - 遗留问题混乱代码
    • 在数据层,我会做“var model = repository.get(id)”,模型将包含来自这两个世界的数据,并且当我做“repository.Save(entity)”时,它将更新两个数据源 - 在本地数据库只有项目特定的字段将被存储。问题:a)可能的泄露抽象b)始终只从Web服务获取数据,而有时仅需要管理部分
      • 修改,使用ICombinedRepository <语言>它将提供额外的拆分/合并。问题:还需要无论是新的模型或IWithLegacy <语言,LegacyLanguage > ...
  3. 有一个单一的 “同步” 的方法;这将删除项目项列表中不存在遗留的物品,更新那些目前,创建错过遗留的物品,等...

好了,总结的主要问题:

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

无论如何,是否有任何有用的技巧来管理大部分来自不同来源的重复数据?什么是最佳实践?

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

回答

1

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

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

是否使用现有的Web服务取决于您是否愿意更改现有的代码。坚持DRY的做法,你不想重复你已有的东西。如果你想保留Web服务,你可以在反腐败层中添加CUD方法,而不会影响你的遗留应用程序。

在反腐败层中,您将希望利用适配器和外观为您的DDD项目和遗留应用程序集合不同的类。

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

让我知道你是否对此有任何疑问,因为它可能是一个有点高级的话题。我会尽力回答。

祝你好运!

+0

虽然我知道反腐败层,并且您描述了需要相当好的东西(链接也很有用),但这里的主要问题在于它不是很传统;我可以完全访问它,我可以添加/调整接口(保持兼容性),甚至可以访问数据库并更改其模式!所以我想知道避免A-CL(我目前用于只读访问)更好。 – queen3 2009-12-19 10:14:20

+0

@ queen3我明白了。你必须问自己,调整这些接口是否会以负面的方式影响遗留系统的表达域。这听起来像你有两个有界的上下文保持完好。统一所有域名的一种模式是反模式(IMHO)。你不想最终通过代码不能完全揭示其真实意图的遗留系统。即使您将遗留系统重构为更多DDD,它仍然可能以不同的方式表示域,并且仍需要A-CL。总之,我的建议是:如果你需要两个有界上下文,保持A-CL。 – 2009-12-20 00:38:41