我很好奇人们的想法是将DAL实体的Id保留为Domain Entity的属性,绝对是最只读的属性。
我的第一个想法是这样做是可以的,但我想的越多,我就越不喜欢这个主意。在所有域模型应该完全不知道数据如何持久化之后,每个域模型上的保持和Id属性是一个不太微妙的指示。持久层可以是不需要主键的东西,或者在域模型中暴露的另一个属性可以是用于识别的合适候选者,模型号。也许
但是那让我想到,对于没有可靠的方法来唯一识别数据库持久层中的条目的域模型,它们在更新或删除时如何识别条目?
基于弱引用键的字典可以做到这一点; WeakDictionary<DomainEntity, PrimaryKeyType>
。只要存储库的客户端获取 DomainEntity
对该实体及其持久层Id的弱引用的集合存储在此内部字典中,该字典就会成为存储库实现的一部分然后,当有时间将修改后的实体返回到存储库以更新持久层时,可以执行以下操作以获取Id
PrimaryKeyType id = default(PrimaryKeyType);
if (!weakDictionary.TryGetValue(someDomainEntity, out id))
// id not found, throw exception? custom or otherwise..
// id found, continue happily mapping domain model back to data model.
我认为这种方法的好处是,域实体无需维护其持久层特定的ID,并且存储库强制您通过调用Fetch...
方法获得合法的域实体,或者Add/CreateNew
方法,否则你应该尝试更新/删除它会引发异常的实体。
我知道这可能是过度工程化的,我应该坚持下去并务实,我只是好奇其他人对此的看法。
我不想仅针对这个小问题启动另一个线程,因为它有些相关。但是因为它是最近我开始研究DDD(虽然在这种情况下我的数据库是第一个)我想知道我是否可以确认我对Domain Entities有正确的心态,这里是我的Employee域实体的一个减少的例子。
public class Employee : DomainEntity
{
public string FirstName { get; }
public string LastName { get; }
public UserGroup Group { get; }
// etc..
// only construct valid employees
public Employee(string firstName, string lastName, SecureString password, UserGroup group);
// validate, update. (not sure about this one.. pulled it
// from an open source project, I think that names should be able to be set individually).
AssignName(string firstName, string lastName);
// validate, update.
ResetPassword(SecureString oldPassword, SecureString newPassword);
// etc..
}
谢谢!
答案 0 :(得分:4)
您使用弱引用的提议有一个主要缺陷。
您可能知道,域实体具有重要的特征,因为它们必须具有身份。出于比较原因,这很重要。如果两个实体具有相同的标识,无论其属性的值如何,则认为它们是相同的:
Entity1 == Entity2 ⇔ Entity1.Identity == Entity2.Identity
一种典型的设计模式&#34;将继承DomainEntity<T>
抽象类中的所有实体,这将覆盖这些对象的比较并按身份进行比较。
现在,考虑一下使用弱参考查找的方法。让我们举一个例子:
你取一个Entity1
,说&#34; Reegan Layzell&#34;用户,来自存储库。然后你拿到完全相同的&#34; Reegan Layzell&#34;来自存储库的实体再次为Entity2
。您现在在两个对象中的域中具有相同的实体。但他们有不同的参考(当然)。
比较时,这些实体在您的域中不会被视为相等。
我很钦佩您将恐惧引入数据库问题到您的域模型中,但是将数据库ID传播到您的实体中几乎不会影响模型的质量,它会为您节省很多麻烦。就像你说的那样,我们需要务实。
关于您的Employee
示例:AssignName
真的有意义吗?实际上,员工的名字在创作后真的会改变吗?除此之外,看起来你有正确的想法。我强烈建议你看这个:吉米·博加德Crafting Wicked Domain Models。