我很好奇人们的想法是将DAL实体的Id保留为域实体的属性,绝对是最只读的属性.
我的第一个想法是这样做是可以的,但我想的越多,我就越不喜欢这个主意.在所有域模型应该完全不知道数据如何持久化之后,每个域模型上的保持和Id属性是一个不太微妙的指示.持久层可以是不需要主键的东西,或者在域模型中暴露的另一个属性可以是用于识别的合适候选者,模型号.也许.
但是那让我想到,对于那些没有可靠的方法来唯一识别数据库持久层中的条目的域模型,它们在更新或删除时如何识别条目?
基于弱引用键的字典可以做到这一点; WeakDictionary<DomainEntity, PrimaryKeyType>.只要存储库的客户端Fetch是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.
Run Code Online (Sandbox Code Playgroud)
我认为这种方法的好处是,域实体不需要维护其持久层特定的ID,并且存储库强制您通过某种Fetch...方法或Add/CreateNew方法调用获得合法的域实体,否则您应该尝试更新/删除它将引发异常的实体.
我知道这可能是过度工程化的,我应该紧缩并务实,我只是好奇其他人对此的看法.
我不想为这个小问题启动另一个线程,因为它有点相关.但是因为它是最近我开始研究DDD(虽然在这种情况下我的数据库是第一个)我想知道我是否可以确认我对域实体有正确的心态,这是我的员工域实体的一个减少的例子.
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, …Run Code Online (Sandbox Code Playgroud)