该项目中有两个数据源:一个是项目自己的数据库,另一个是(半)旧式Web服务。问题在于管理员必须保持同步并管理两者,以便用户不必知道他们是单独的(或者知道,但他们不在意)。用于管理两个相关数据源的管理界面
下面是一个例子:有语言列表。这两个应用程序 - 项目和传统 - 都需要使用它们。但是,他们都添加了自己的意思。例如,项目可能需要激活/不激活,而遗产将需要语言代码。
但管理部分必须管理所有内容 - 语言名称,活动/不活动,语言代码。加载时,两个系统的数据必须合并并显示,并且保存时,必须在两个系统中更新数据。
因此,什么是最好的方式来表示这种分离的数据(要在管理页面中使用)?请注意,我使用ASP.NET MVC/NHibernate。
- 如何管理遗留数据?
- 我是否将管理部分连接到遗留Web服务外部接口 - 目前它只有GetXXX()方法 - 并添加了错过的C [UD]方法?
- 或者,我直接连接到遗留数据库 - 这是可能的,因为我确实控制它。
- 我该怎么做数据拆分/合并 - 在控制器/服务层,还是在存储库/数据层?
- 在控制器层我会做“VAR视图模型=新的视图模型{迈德特= ...,LegacyData = ...};问题 - 遗留问题混乱代码
- 在数据层,我会做“var model = repository.get(id)”,模型将包含来自这两个世界的数据,并且当我做“repository.Save(entity)”时,它将更新两个数据源 - 在本地数据库只有项目特定的字段将被存储。问题:a)可能的泄露抽象b)始终只从Web服务获取数据,而有时仅需要管理部分
- 修改,使用ICombinedRepository <语言>它将提供额外的拆分/合并。问题:还需要无论是新的模型或IWithLegacy <语言,LegacyLanguage > ...
- 有一个单一的 “同步” 的方法;这将删除项目项列表中不存在遗留的物品,更新那些目前,创建错过遗留的物品,等...
好了,总结的主要问题:
- 在Web服务上开发CRUD接口还是直接连接到它的数据库(这是在我完全控制下的,这样我甚至可以在以后决定将该Web服务部分移入主应用程序或使其使用主数据库)?
- 我有独立的项目和遗留实体的类,因此单独管理,或有项目的实体具有所有遗留领域,保存/加载时透明地管理?
无论如何,是否有任何有用的技巧来管理大部分来自不同来源的重复数据?什么是最佳实践?
在非管理部分,我想完全隐藏遗留数据的概念。这就是我现在所做的,在存储库接口后面。但对于管理员部分来说,它并不那么清晰或简单...
虽然我知道反腐败层,并且您描述了需要相当好的东西(链接也很有用),但这里的主要问题在于它不是很传统;我可以完全访问它,我可以添加/调整接口(保持兼容性),甚至可以访问数据库并更改其模式!所以我想知道避免A-CL(我目前用于只读访问)更好。 – queen3 2009-12-19 10:14:20
@ queen3我明白了。你必须问自己,调整这些接口是否会以负面的方式影响遗留系统的表达域。这听起来像你有两个有界的上下文保持完好。统一所有域名的一种模式是反模式(IMHO)。你不想最终通过代码不能完全揭示其真实意图的遗留系统。即使您将遗留系统重构为更多DDD,它仍然可能以不同的方式表示域,并且仍需要A-CL。总之,我的建议是:如果你需要两个有界上下文,保持A-CL。 – 2009-12-20 00:38:41