【发布时间】:2014-08-23 12:47:47
【问题描述】:
我已经阅读了大量有关领域驱动设计的文章,并且使用该设计完成了一些相当复杂的项目。他们都有自己的缺陷和反模式,这些缺陷和反模式在此过程中得以实现。可以理解,因为这是一个学习过程。然而,我被困在一个似乎无法通过谷歌解决的主要概念(也许我只是没有想出正确的搜索词)或我自己的反复试验。
我已经阅读了几篇文章,它们强调将您的领域模型和持久性模型分开。不要让诸如 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#,因为我确信大多数示例将使用这两种语言中的一种。
【问题讨论】:
-
人们通常使用单独的“持久 ID”并将其用于数据库中的外键。
-
但这不是违反“在您的域模型中没有仅数据库规则”吗?既然除了坚持之外没有任何理由存在,它不应该在那里,对吧?
-
是的,有点,但您不应该对此过于严格,因为这是您无法规避的技术要求。对于既不公开公开也不在内部用于状态保持的数据库 ID 使用私有字段很容易。例如,它可以添加到公共层超类中,因此隐藏到任何“真实”域对象中。