Je veux appliquer/pratiquer DDD avec mon nouveau projet donc je crée ces classes de base DDD typiques, c'est-à-dire, Entity
, ValueObject
, AggregateRoot
et ainsi de suite.Entité DDD - sont deux entités avec l'identité par défaut considérée comme égale
Question: Lorsque vous avez l'objet de base Entité IEquatable
mettre en œuvre, si deux entités ayant une valeur par défaut de l'identité (Id) être considérés comme Différent ou égale?
Par exemple, j'utilise Guid
type pour l'identité
public interface IEntity
{
Guid LocalId { get; }
}
public abstract class Entity : IEntity, IEquatable<Entity>
{
public Guid LocalId { get; private set; }
protected Entity()
{
this.LocalId = Guid.Empty;
}
protected Entity(Guid id)
{
if (Guid.Empty == id)
{
id = Guid.NewGuid();
}
this.LocalId = id;
}
public bool Equals(Entity other)
{
if (ReferenceEquals(other, null))
{
return false;
}
if (ReferenceEquals(other, this))
{
return true;
}
// **Question** - should I return false or true here?
if (other.LocalId == Guid.Empty && this.LocalId == Guid.Empty)
{
return false;
}
return (other.LocalId == this.LocalId);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null))
{
return false;
}
if (ReferenceEquals(obj, this))
{
return true;
}
if (!obj.GetType().Equals(typeof(Entity)))
{
return false;
}
return Equals((Entity)obj);
}
public override int GetHashCode()
{
return this.LocalId.GetHashCode();
}
public static bool operator==(Entity left, Entity right)
{
return Equals(left, right);
}
public static bool operator!=(Entity left, Entity right)
{
return !Equals(left, right);
}
}
Juste une question non liée à votre question: est-ce une chose C# pour définir cette clases de base? En 'PHP', j'aime éviter l'héritage, en particulier dans les objets de domaine (entités, racines agrégées, objets de valeur). –
@Constantin: non, ce n'est pas une chose C# :) --- c'est un choix de design fait par certaines personnes. Je ne les utilise pas moi-même et je ne le recommanderais pas non plus. Ne fait pas mal, mais n'ajoute pas vraiment beaucoup de valeur à mon humble avis. –
@David, pour répondre à votre question: techniquement les "objets" sont les mêmes mais d'un point de vue métier avoir une entité/agrégat sans clé n'a pas grand sens et l'égalité, ou son absence, n'a pas de sens. –