我们有一个业务模型和关联的存储库。 这由来自数据库中不同表的不同数据填充。 在某些时候,用户对数据进行更改后,我们必须将这些更改反映回数据库。 当前,这是通过将键与这样的对象相关联来完成的:

class DataObject 
{
    string SomeProperty;
    // more properties

    int Table1Id;
    int Table2Id;
    int Table3Id;
}

我建议通过添加标识源表的属性,然后使用单个“ ExternalId”属性来进行一些清理。 但是我想知道是否有更好的模式可以更好地将数据和业务层分离。

我们正在使用C#,但这是一个与语言无关的问题。

#1楼 票数:0

假设您已经将对象模型映射到数据库模型,现在必须实际执行映射,并且大致有两种选择: Active RecordData Mapper

活动记录

选择持久性策略时,您需要做出的第一个决定是将执行映射的责任放在哪里。 您有两种截然不同的选择:您可以让每个实体类本身负责映射,或者可以使用完全独立的类对数据库进行映射。

第一个选项称为活动记录模式:一个对象,该对象在数据库表或视图中包装一行,封装数据库访问,并在该数据上添加域逻辑。 Active Record方法将持久性方法直接放在实体对象上。 在这种情况下,Address类可能具有诸如Save,Update和Delete之类的方法,以及向数据库查询Address对象的静态Load方法。

Active Record模式的典型用法是实质上在数据库表中的单行周围创建一个强类型的类包装器。 因此,Active Record类通常是数据库结构的精确镜像(这在工具之间会有所不同)。 许多Active Record实现将直接从数据库结构生成实体对象。

数据映射器

尽管Active Record模式可能很好,但是拥有与数据库模型不同的对象结构通常很有价值。 您可能需要将多个类映射到同一数据库表。 您可能有一个旧式数据库架构,该架构不适合您要在某些业务逻辑中表达的对象的形状(在我的最后几个项目中,这对我来说很常见)。

这是我选择数据映射器模式的地方:一层映射器对象,它们在对象和数据库之间移动数据,同时保持它们彼此之间以及映射器类本身的独立性。 数据映射器模式剥离了实体对象的大部分持久性责任,转而使用实体外部的类。 使用Data Mapper模式,您可以使用某种存储库访问,查询和保存实体对象。

您如何在两者之间进行选择?

杰里米·米勒(Jeremy Miller)在他的文章中说:

“我个人偏向于Data Mapper解决方案。此外,Active Record最适合具有简单域逻辑,CRUD密集型应用程序(即创建,读取,更新和删除)的系统以及域模型的情况。 Active Record对于许多.NET开发团队来说可能更舒适,因为它暗示了以数据为中心的工作方式,这对于.NET团队来说更为常见,并且坦率地说,.NET支持的更好。我将.NET空间中的大多数持久性工具称为Active Record工具。

另一方面,Data Mapper更适用于具有复杂域逻辑的系统,其中域模型的形状将与数据库模型有很大差异。 Data Mapper还将您的域模型类与持久性存储分离。 对于需要将域模型与不同的数据库引擎,模式甚至完全不同的存储机制一起重用的情况,这可能很重要。

注意 :这些模式大部分来自Martin Fowler的书《企业应用程序体系结构的模式》。 如果您与编写企业应用程序有关,我强烈建议您阅读本书。

有关更多信息,请查看Jeremy Miller的文章

  ask by amnesia translate from so

未解决问题?本站智能推荐:

2回复

业务对象和多个数据源

在WPF应用程序上,我创建了两个单独的项目:UI(带有XAML和ViewModels)和“ Core”(人们称之为“域对象”或“业务对象”的对象),这些对象代表了我所使用的离散概念案例)。 我知道这是一个好习惯。 但是我的许多业务对象都与多个数据源进行交互。 例如,一个Document对
1回复

多个使用者和单个数据源的设计模式

我正在为某个提供自己的自定义API的硬件设备设计Web界面。 所述web界面可以一次管理多个设备。 通过使用自定义API进行轮询,可以从设备中检索数据,因此最好使其异步。 最明显的是有一个轮询数据的轮询线程,保存到具有信号量的进程范围的单例中,然后Web服务器线程将从所述单例中检索数据并
3回复

使用多个数据源针对单个对象构建应用程序

我正在努力寻找适合我的应用程序体系结构的解决方案。 对于我的应用程序,我为客户提供一门课程。 用于填充客户对象的数据分布在多种不同类型的数据源中。 主要部分在只读的Oracle数据库中公开,其他部分在使用Web服务公开,并且我需要将一些额外的数据保存到另一个数据源(例如,使用entityf
4回复

DAO/抽象工厂模式-多个数据源

我目前使用抽象工厂模式设置了一些DAO。 它看起来像这样: 静态GetDaoFactory()返回一个底层的SqlDaoFactory 。 直到今天,所有Daos都使用相同的SQL数据库。 现在,我想在这个工厂添加另一个DAO,但DAO将与外部服务而不是SQL数据库交互(假设这是Get
1回复

在创建期间并非所有数据源都可用数据时,如何从多个数据源构建Java对象?

我有一个我要解决的设计问题,如果您有任何建议,希望能收到您的回音。 假设我们有一个您正在侦听的队列,该队列接收到一条消息,应用程序中的侦听器将其抓取,并构建一个对象,然后将其推入缓存,此时对象信息具有它所需要的数据。仅从队列中接收到,但是它仍在waiting other data sources n
4回复

寻找用于管理需要更新多个数据源中的数据的操作的设计模式

我有一个后期操作api。 我们正在使用C#并为每个层分别设置了组件(Api,业务逻辑,数据访问) 此操作必须与多个数据源交互。 检查数据源1中是否已存在数据 如果数据源1中不存在,请检查数据源2中是否已存在数据 如果数据源2中不存在,则将其插入到数据源1中,然后将其插入到
1回复

具有多个数据源的应用程序的设计模式?

我目前正在处理需要离线和在线操作的Windows窗体应用程序。 这个想法是,当运行该应用程序的设备具有Internet连接时,它将从Web服务获取以获取其数据,但是当没有连接时,它将从本地数据源中以本地文件系统中JSON的形式获取。 我最好使用服务和管理器设计模式(3层)。 但是,我不确
2回复

涉及多个数据源之间交互的设计模式

我一直将DAO模式用于CRUD操作,每个DAO负责一次访问唯一的数据源,并使用泛型来支持多个实体。 现在,我需要进行以下更改 1.-数据源将在运行时动态添加/删除 2.-例如,一个工作单元涉及:从数据源A读取,在B上写,如果B成功,则从A删除。 A和B将是可互换的,这使我想到了某种