domain-driven-design – 持久性模型和域模型之间的映射

我已经完成了关于域驱动设计的IMMENSE阅读量,并且使用该设计完成了一些相当复杂的项目.所有这些都有他们的缺陷和反模式,沿途实现.可以理解,因为这是一个学习过程.但是,我仍然坚持一个我似乎无法通过谷歌解决的主要概念(也许我只是没有提出正确的搜索条件)或者我自己的反复试验.

我已经阅读了几篇强调声称保持域模型和持久性模型分离的文章.除非ID具有域用途,否则不要让ID之类的内容泄漏到您的域模型中.根据该政策,如何在实践中坚持域模型?我读过的所有文章都在摘要中讨论这个问题,但我找不到一个不违反这个问题的具体例子.

我有一个相对庞大而复杂的Web应用程序,我正在构建并希望实现“最佳”域和持久性分离.我正在使用手动ORM(是的,是的,我知道 – 我不应该 – 等等等等 – 但是,基础表和查询太复杂了,不能使用像EF或NHibernate这样的东西).在大学的这个会计软件包中,我有总帐日记帐分录,结构如下:

Public Class Journal

    Public Property AccountCode As SFSAccountCode = Nothing

    Public Property Amount As Decimal = 0

    Public Property BudgetCategory As BudgetCategory = Nothing

    Public Property [Date] As DateTime = Nothing

    Public Property ChildAccount As ChildAccount = Nothing

    Public Property Description As String = ""

    Public Property FiscalYear As SFSFiscalYear = Nothing

    Public Property Fund As Fund = Nothing

    Public Property JournalID As Int32 = -1

    Public Property Notes As String = ""

    Public Property Program As String = ""

    Public Property Source As JournalSource = Nothing

    Public Property Status As JournalEntryStatus = JournalEntryStatus.Open

    Public Property TransactionType As TransactionType = Nothing
End Class

如果不包含uniqueID(JournalID),如何将域模型中的实例映射到持久性模型中的实例?根据我的理解,您将通过其不变量来考虑唯一的对象.如果您的对象只有一个或两个属性作为字符串或整数,则很容易.我显然有许多属性,其中有几个是域模型本身.

我确信有一些我错过的关键概念 – 任何人都可以指向一个资源(具体代码为奖励!)来帮助解释如何在没有数据库ID的持久模型与域模型之间进行映射?

顺便说一句,我知道我的属性应该是私有集合,用于良好的域设计.他们将有一次我可以更好地找出持久性和域之间的映射.我碰巧在VB.NET中编写代码但可以读取Java或C#,因为我确信大多数示例都是这两种语言中的一种.

解决方法

根据Domain Driven Design:

关于实体和价值观的一些话

有权限对象(实体)和值对象(值).值由一组值(或字段)标识.因此,如果我们有两个具有相同字段的值对象,它们对我们来说并不是不可分割的(作为现实生活中的模型).值对象通常是不可变的.

实体对象不由包含的值标识.实体对象由其自身唯一的存在来标识.我们不能说两个同名的人提出单身真人.

例如:

class ProductAmountPair {
    public Product Product { get; set; }
    public int Amount { get; set; }
}

class Order {
    public int Id;
    public IList<ProductAmount> { get; set; }
}

ProductAmount是一个值,Order是一个实体(实际上它取决于具体情况).

要识别实体对象,有必要确定一些唯一值(键).在某些域中,密钥是从外部给出的(来自现实生活),但是另外一些密钥需要生成密钥,因此应用程序本身定义了一种方法.

因此,结论是:对于实体,我们必须引入关键字段来识别它们.这是必要的,因为实体不能通过它们包含的一组值来识别.

数据库

好的,数据库及其角色怎么样?

今天,数据库不仅仅是数据存储,而且是用于确保数据完整性,事务处理等的复杂机制.通常,复杂的任务(如并发访问)仅通过将它们“广播”到数据库来解决.

出于同样的原因,数据库通常用于生成关键值,它们提出了获得新的唯一值的良好可靠机制.
因此,密钥是由数据库生成的,因为它易于实现,并且密钥用于将域模型实体映射到持久性模型,因为它很自然.

可以说,数据库引擎需要为每个表创建主键,因此域中的每个类都应该具有键字段,因此它是实体.但:

>关系数据库引擎使用主键进行引用,不应以任何方式影响域模型
>对于实值类型(如描述的ProductAmount类),不应使用存储在DB键中从数据库中获取相应的对象.它没有任何意义,因为某些键(通过值类型的定义)无法识别值对象.但是存储在数据库中的密钥用于加载对象关联.因此,此操作必须由ORM封装.此外,从数据库获取值对象的唯一方法是从某个实体的字段中获取它.

坚持和领域

在谈论域时,我们为什么要考虑数据库(甚至关系数据库!)?在他的DDD书中,埃里克埃文斯说“不要面对技术和范式”.

有时,由于强大的性能或可靠性要求,我们必须放弃一些DDD纯度和清晰度,并使域模型更多(例如)“关系”(我的意思是大多数类表映射).

我们只需处理它.

出于同样的原因,我们可以承认实体关键领域的部分“技术”角色.但我们也承认其主要作用是域名识别属性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


HTML代码中要想改变字体颜色,常常需要使用CSS样式表。CSS是一门用来描述网页上样式的语言,通过编写CSS代码可以实现网页中各元素的大小、颜色、字体等各种样式的控制。那么如何在HTML代码中应用CSS样式来改变字体颜色呢?这里为大家介绍一下。 首先,在HTML代码...
HTML代码如何让字体盖住图片呢?需要使用CSS的position属性及z-index属性。 img { position: relative; z-index: -1; } p { position: absolute; to...
HTML代码字体设置 在HTML中,我们可以使用标签来设置网页中的文字字体。常用的字体标签是font和style,下面我们来学习如何使用这些标签。 1. font标签 使用font标签可以改变文字的字体、颜色和大小。它有三个属性font-family、color和...
在网页设计中,HTML代码的字体和字号选择是非常重要的一个环节,因为它们直接关系到页面的可读性和视觉效果。 要指定文本的字体和字号,可以使用HTML中的样式属性。使用样式属性设置字体和字号,如下所示: <p style="font-family: Aria...
HTML(Hypertext Markup Language,超文本标记语言)是一种用于创建网页的标准语言。它由许多标签(一对尖括号包围的关键字)组成,这些标签告诉浏览器如何显示内容。使用HTML代码,我们可以轻松地创建各种类型的图像和图形,如太极图。 在HTM...
外链是指在一个网页中添加一个指向其他网站的链接,用户可以通过这个链接直接跳转到其他网站。在HTML中,实现外链的方法很简单,只需要使用标签就可以了。 <a href="http://www.example.com">这是一个外链,点击跳转到www.ex...
HTML代码是实现网页界面的基础,而网页中的各种表单则是用户和网站进行交互的重要方式之一。下面我们来介绍如何使用HTML代码实现一个简单的报名表格。 <form action="submit.php" method="post"> &lt...
HTML是一种标记语言,用于开发网站和其他互联网内容。字体是网站设计中的关键元素之一,它可以决定网站的整体风格和呈现效果。HTML提供了字体编辑器,使网站设计变得更加容易。 <font face="Arial"> 这里是Arial字体 &...
HTML代码中,字体样式是开发者们必备的一部分。在HTML中,我们可以通过特定的标签和属性设置字体的样式、颜色和大小,以达到更好的排版效果。 <p style="font-size: 14px; color: #333; font-family:...
HTML中的字体可以设为粗体,以强调文本信息。我们可以通过使用一些标签来实现这一功能。其中,常用的标签包括: 1. 标签:该标签会把文本加粗显示,语法如下: 这是一段加粗的文本 2. 标签:与标签作用相同,但语义更强,表示该文本内容的重要性。语法如下:...
HTML代码可以实现文件的上传和下载,在网页开发中相当常见。通过使用<input>标签和<form>标签,我们可以轻松创建一个文件上传表单。 <form action="upload.php" method="post" enct...
HTML代码非常常见于网页设计中。在一些需要处理时间相关数据的场景下,可能需要将时间戳转换为实际时间,这时候就需要使用一些特定的HTML代码。 function timeStamp2Time(time){ var date = new Date(time...
HTML是一种用于创建网页的标记语言。在HTML中,我们可以使用超链接标签实现下载文件到本地的功能。 具体实现步骤如下: <a href="文件的URL" download="文件名">下载文件</a> 其中,href属性是文件...
在HTML代码中,对于字体靠左对齐有各种方法。其中最简单的方式之一是使用pre标签。 使用pre标签可以保留一段文本中的空格和换行符,从而使代码排版更加整齐。下面是一个例子: <p>这是一个段落。</p> &lt...
HTML代码字典是一本解释HTML标记和属性的参考文献。这本字典中包含了最常用的HTML代码以及它们的属性和值的详细描述。 例如,以下是HTML代码字典中的一部分内容: <a href="url">link text</a> 在...
在网页开发过程中,遇到一些需要用户复制的内容,我们通常都会提供复制按钮,让用户更方便地复制所需内容。下面我们来介绍如何使用html代码实现一键复制的功能。 var copyBtn = document.querySelector('#copy-bt...
用户登录 欢迎来到公司登录界面,请输入用户名和密码登录 用户名: 密码: 代码解释: 第1行:定义了一个 HTML 文档 第2行:开始了 HTML 头部 第3行:定义了...
HTML 代码是用来创建网页的语言,它包含了许多不同的元素和属性,让我们可以在网页中添加各种不同的元素和内容,如文字、图片、链接等等。在编写 HTML 代码时,我们可以使用各种不同的样式来美化我们的网页,例如更改字体、颜色、大小等等。 font-family:...
HTML代码中的字体转移 在编写HTML代码时,我们经常会使用各种字体来增强页面的可读性和视觉效果。但是,有些字符或特殊符号可能会在HTML中具有不同的含义,这就需要使用字体转义转换成HTML可以正常显示的字符。 在HTML中,使用"&"符号表示一个特殊字符将要被转...
HTML 编程语言中,你可以使用字体属性来更改文本的字体大小、颜色和样式。其中,字体颜色是最常用的样式更改。在 HTML 中,你可以使用 "color" 属性来更改文本的颜色。下面是一个使用 "pre" 标签的代码示例,演示如何使用 "color" 属性来更改字体颜色...