Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing DDD Entity class in C#

I'm now starting out on DDD, I've already found a nice implementation for ValueObject but I cant seem to find any good implementation for Entities, i want a generic base entity type which will have an ID(needed by the specification) and implement currect equality operations.

Whats the most elegent solution?

like image 774
MindFold Avatar asked Feb 24 '10 13:02

MindFold


2 Answers

The only characteristic of an Entity is that it has a long-lived and (semi-)permanent identity. You can encapsulate and express that by implementing IEquatable<T>. Here's one way to do it:

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
}
like image 160
Mark Seemann Avatar answered Nov 04 '22 15:11

Mark Seemann


For implementation of correct equality operations I recommend to have a look on a base class of domain entities in Sharparchitecture - https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/EntityWithTypedId.cs . It has implementation of all required functionality. And have a look on some other code there, IMO, it will be very useful for you and your case.

like image 3
zihotki Avatar answered Nov 04 '22 15:11

zihotki