在领域驱动设计中,实体的一个定义特征是它具有唯一标识。
问题:
我无法在实例创建时为实体提供唯一标识。这个标识只有在实体持久化之后由仓储库提供(这个值从底层数据库提供)。
我不能使用 Guid
值来解决这个问题。现有数据是使用 int
主键值存储的,我无法在实例化时生成唯一的 int。
我的解决方案:
- 每个实体都有一个唯一的标识值
- 这个标识只有在持久化之后才设置为真正的标识(由数据库提供)
- 在持久化之前实例化的实体将标识设置为默认值
- 如果标识为默认值,则通过引用比较实体
- 如果标识不是默认值,则通过标识值比较实体
代码(所有实体的抽象基类):
public abstract class Entity<IdType>
{
private readonly IdType uniqueId;
public IdType Id
{
get
{
return uniqueId;
}
}
public Entity()
{
uniqueId = default(IdType);
}
public Entity(IdType id)
{
if (object.Equals(id, default(IdType)))
{
throw new ArgumentException("The Id of a Domain Model cannot be the default value");
}
uniqueId = id;
}
public override bool Equals(object obj)
{
if (uniqueId.Equals(default(IdType)))
{
var entity = obj as Entity<IdType>;
if (entity != null)
{
return uniqueId.Equals(entity.Id);
}
}
return base.Equals(obj);
}
public override int GetHashCode()
{
return uniqueId.GetHashCode();
}
}
问题:
- 您是否认为这是在实例创建时生成Guid值的良好替代方案?
- 对于这个问题,还有更好的解决方案吗?
uniqueId
字段的? 而且当更新时,你的 repo 如何访问该字段,以知道要更新哪一行? - Timo