我正试图在脑海中实施DDD方法。 到目前为止,我知道实体是唯一的,并通过其属性的组合来识别。
实体是抽象类,将由其他实体类实现。
到目前为止,我知道Version属性用于管理并发。 需要帮助本课程的其余部分。
我正在学习DDD,所以请描述您对此的看法或分享有用的具体主题链接。
public abstract class Entity<T>
{
#region Properties
protected T _Id;
private int _Version;
#endregion
private static bool IsTransient(Entity<T> obj)
{
return (obj != null) &&
Equals(obj.Id, default(T));
}
private Type GetUnproxiedType()
{
return GetType();
}
public virtual T Id
{
get
{
return _Id;
}
protected set
{
_Id = value;
}
}
public virtual int Version
{
get
{
return _Version;
}
set
{
_Version = value;
}
}
public override bool Equals(object obj)
{
return Equals(obj as Entity<T>);
}
public virtual bool Equals(Entity<T> other)
{
if (other == null) return false;
if (ReferenceEquals(this, other)) return true;
if (!IsTransient(this) &&
!IsTransient(other) &&
Equals(Id, other.Id))
{
var otherType = other.GetUnproxiedType();
var thisType = GetUnproxiedType();
return (thisType.IsAssignableFrom(otherType)
|| otherType.IsAssignableFrom(thisType));
}
return false;
}
public override int GetHashCode()
{
if (Equals(Id, default(T)))
{
return base.GetHashCode();
}
return Id.GetHashCode();
}
public static bool operator ==(Entity<T> e1, Entity<T> e2)
{
return Equals(e1, e2);
}
public static bool operator !=(Entity<T> e1, Entity<T> e2)
{
return !Equals(e1, e2);
}
}
更新
经过一番研究后,我结束了这个
当我们尝试比较两个对象时,使用Equals方法会派上用场。例如,在应用程序中的成像位置,其中我们在多个实例中具有相同的对象。一个来自数据库,一个来自客户端。我们需要找出该对象是否相同但不相同。
为此,我们将使用Equals方法。
答案 0 :(得分:3)
实体不是由其属性的值唯一标识的;实体具有标识,但这并不意味着标识由其属性的值组成。 这意味着,如果您更改一个实体的属性,它的身份将会改变,并且您不希望这种行为。 (例如,如果您的地址发生变化,您的身份不会改变,您仍然是同一个人,住在另一个地址)。
(我看到你通过使用Id属性实现了身份/相等,这是一件好事。)
在实体旁边,您有值 - 对象。值对象的标识由其属性的值组成,因此,值对象最好是不可变的,因为更改值对象也意味着您更改其标识。
但是,你的问题是什么?