1

请考虑以下情况。在不同的软件模块之间共享域模型。

三个应用程序A,B和C必须合作:A是一个外部的第三方应用程序,而B和C是内部应用程序(所以我们可以控制B和C,而不是A)。 B回复A提出的请求,同时使用C和B本身包含的逻辑。将B看作A和C之间的层。

A,B和C有一些基本的共同概念,理解和使用。

假设这里的关键任务是去耦所有的东西,所以如果明天我们想要使用A1而不是A,B和C之间的所有交互都保持固定(并且分别如果我们想用C1代替C, B和A之间的所有交互都保持固定)。

的问题是关于数据模型设计,B和C的两种解决方案来我的脑海:

  1. 共享数据模型:我们在不同的项目中引入一个数据模型d。 D包含共同概念的“内部”版本,并且被B和C使用:概念的A版本被映射到D版本并且可以被B和C使用和理解。如果明天我们想要要使用A1而不是A,我们只需重新编写适配器即可。如果我们想要摆脱C,我们使用通用数据模型D编写C1。
  2. 复制的数据模型:B和C都有自己的数据模型版本。我们现在有两个适配器:一个介于A和B之间,另一个介于B和C之间。如果明天我们要更改A或C,则我们重写相应的适配器。

有没有处理这种情况的最佳做法?有没有其他选择1.和2.? 1和2是否有任何内在问题?

编辑 以下请求我会尽力提供一个更明显的例子(当然这里的一切都是虚构的。此外原谅我的可怕的幻想)。

ACME ltd是一家二手车零售公司,需要有关每辆购买和即将出售的汽车的详细信息。这个过程是外包的,所以他们公开了一个简单的DTO,包含两个类ACME.CarInfoRequestACME.CarInfoResponse(包含适当的字段)。特别是有ACME.Car的经营理念。

ACME将外包给汽车数据提供商INITECH inc。 INITECH拥有一个包含汽车信息的大型更新数据库,并且还具有与警方记录的实时连接,以检查汽车是否被盗。 INITECH有一个主要的应用程序与客户交互,并使用不同的应用程序与警方进行交流:INIMAIN应用程序和INIPOLICE应用程序。这两款应用都有“汽车”的基本概念。

问题是:INITECH应该使用共享的数据模型,并让INIMAIN和INIPOLICE将它添加为依赖项,还是应该在两个应用程序中实现镜像? 换句话说,这两种解决方案可能是:

1)INITECH构建INIDATA项目。 INIDATA包含INIDATA.Car来表示“汽车”的概念。 INIMAIN和INIPOLICE都将INIDATA添加为依赖项,并使用相同的INIDATA.Car。当INIMAIN和INIPOLICE谈论“汽车”时,不需要翻译(因为它们都是指相同的INIDATA.Car)。另一方面,INIMAIN通过适配器将包含在ACME.Car中的信息映射到INIDATA.Car

2)INIMAIN有自己的代表INIMAIN.Car(和INIPOLICE分别有INIPOLICE.Car)。当INIMAIN希望INIPOLICE询问关于汽车的信息时,首先将其从INIMAIN.Car转换为INIPOLICE.Car。然后,当INIPOLICE回复时,INIMAIN会将所有从INIPOLICE.Car返回的内容翻译为 INIMAIN.Car。当然,ACME.Car仍然通过适配器映射到INIMAIN.Car

希望现在更清楚(即使这个例子很可能是尴尬的,再次原谅我有限的幻想)。

+1

你的问题可以解释一些解释。如果你提供一个更具体的例子,而不是使用'A','A1','B','B'等名字,这将有所帮助。 – CKing

+0

@C肯定,将尽快编辑问题 – Gabriele

回答

1

的问题是:应该Initech的使用共享数据模型,让INIMAIN和INIPOLICE添加它作为一个依赖或应该实现的两个应用程序

的这个问题的答案取决于名单上的镜子服务INTECH计划向其客户提供。

  1. 如果访问报警记录是唯一的服务,英达计划提供其客户,该INIMAININIPOLICE模块都共享同一个INDATA.car域模型(由于只有一个数据模型,它是唯一合乎逻辑的需要支持即由外部警方的应用程序,INPOLICE会说话)
  2. 在另一方面理解数据模型中,如果英达计划提供更多的服务,如通过CARINSURANCE模块的汽车保险细节与外部保险数据服务商谈判冰,那么INPOLICECARINSURANCE模块具有他们自己的数据模型,根据他们所说的外部服务建模(警察记录外部服务和保险记录外部服务通常会有他们自己的请求模型)会更有意义。在这种情况下,英达应该有INDATA.PoliceCarINDATA.InsuranceCar数据模型和INMAIN将映射ACME.car要么INDATA.PoliceCarINDATA.InsuranceCar取决于由ACME

正在请求哪种类型的信息,这一切都归结到是否英达计划向其客户提供单一服务或多项服务。如果在不久的将来难以确定,那么坚持使用由INPOLICEINMAIN共享的单个数据模型更有意义,而不是针对INTECH可能永远不会遇到的用例进行过度设计。