gpt4 book ai didi

c# - DDD实体类

转载 作者:行者123 更新时间:2023-11-30 22:29:25 25 4
gpt4 key购买 nike

我正在尝试在脑海中实现 DDD 方法。到目前为止,我知道实体是唯一的,并通过其属性的组合来识别。

实体是抽象类,将由其他实体类实现。

到目前为止,我知道 Version 属性用于管理并发。在本类(class)的其余部分需要帮助。

我正在学习 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 方法。

最佳答案

实体不是由其属性值唯一标识的;一个实体有一个身份,但这并不意味着这个身份是由它的属性值组成的。这意味着,如果你改变一个实体的属性,它的身份就会改变,你不希望这种行为。(例如,如果您的地址改变了,您的身份不会改变,您仍然是同一个人,只是住在另一个地址)。

(我看到您已经通过使用 Id 属性实现了身份/平等,这是一件好事)。

在实体旁边,您有值 - 对象。值对象的身份由其属性的值组成,因此,值对象最好是不可变的,因为更改值对象也意味着更改其身份。

但是,你的问题是什么?

关于c# - DDD实体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10242878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com