Je commence maintenant sur DDD, j'ai déjà trouvé une belle mise en œuvre pour ValueObject, mais je ne peux pas sembler trouver une bonne mise en œuvre pour les entités, je veux un type d'entité de base générique qui aura une pièce d'identité (nécessaire par le Spécification) et mettre en œuvre les opérations d'égalité des curret. P>
Quelle est la solution la plus élégante? P>
3 Réponses :
La seule caractéristique d'une entité est qu'il a une identité de longue durée et (semi-) permanente. Vous pouvez encapsuler et exprimer cela en implémentant iéquatif public abstract class Entity<TId> : IEquatable<Entity<TId>>
{
private readonly TId id;
protected Entity(TId id)
{
if (object.Equals(id, default(TId)))
{
throw new ArgumentException("The ID cannot be the default value.", "id");
}
this.id = id;
}
public TId Id
{
get { return this.id; }
}
public override bool Equals(object obj)
{
var entity = obj as Entity<TId>;
if (entity != null)
{
return this.Equals(entity);
}
return base.Equals(obj);
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
#region IEquatable<Entity> Members
public bool Equals(Entity<TId> other)
{
if (other == null)
{
return false;
}
return this.Id.Equals(other.Id);
}
#endregion
}
+1. Est-ce une approche normale pour une grande application? Une question que j'ai posée aujourd'hui attire la critique de l'approche de la classe de base de l'entité: SoftwareEngineering.stackexchange.com/questions/364870/... . Cependant, cela fonctionne très bien pour nous. Il a même été décrit comme anémique dans l'un des commentaires.
@ w0051977 Je ne l'écrirais pas comme ça aujourd'hui. Il est vrai que la caractéristique d'une entité est que c'est la même entité s'il a le même ID, mais que la mise en œuvre de est égale à code> n'est pas utile dans les bases de code réelles.
@Mark Sememann, quelle est l'alternative de jour moderne? Je regardais récemment un parcours pluralsight, qui a construit ceci: github.com/vkhorikov/dddinaction/blob/master/... pour l'entité et ceci: github.com/vkhorikov/dddinaction/blob/master/... pour le ValueObject. Y a-t-il une autre alternative? Merci.
@ w0051977 Je ne voudrais pas prétendre parler pour personne, mais moi-même, mais certainement pas comme ça. Pour moi, Le FP de l'alternative .
@Mark semble merci. Je vais regarder cette vidéo ce soir. Ça a l'air intéressant. Puis-je vous demander si vous utilisez une classe de base d'entité et une classe ValueObject dans vos modèles de domaine? Connaissez-vous un système open source (peut-être sur GitHub) qui les utilise?
@ W0051977 Je ne fais pas du tout, sans classes de base.
Pour la mise en œuvre des opérations d'égalité correctes, je vous recommande de consulter une classe de base d'entités de domaine dans Sharparchitecture -
0 commentaires
Je ne sais pas si vous êtes après une bibliothèque / code d'échantillon spécifique ou des directives. Une bonne solution DDD utilisera l'usine d'instanciation, la persistance séparée du modèle de domaine (la plupart des ormes tend à regrouper les deux ensemble), définissez clairement la limite de domaine, l'application des champs et des opérations via une interface. p>
Je recommanderais vivement le livre en appliquant DDD et des modèles de livres de Jimmy Nilson. Il discute en profondeur à propos de DDD et de meilleures pratiques. Les exemples sont également en C # qui conviendront à votre projet. p>