using System; namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.SeedWork { /// /// Base class for entities /// public abstract class Entity { //Members int? _requestedHashCode; Guid _Id; //Properties /// /// Get the persisten object identifier /// public virtual Guid Id { get { return _Id; } protected set { _Id = value; } } //Public Methods /// /// Check if this entity is transient, ie, without identity at this moment /// /// True if entity is transient, else false public bool IsTransient() { return this.Id == Guid.Empty; } /// /// Generate identity for this entity /// public void GenerateNewIdentity() { if ( IsTransient()) this.Id = IdentityGenerator.NewSequentialGuid(); } /// /// Change current identity for a new non transient identity /// /// the new identity public void ChangeCurrentIdentity(Guid identity) { if ( identity != Guid.Empty) this.Id = identity; } //Overrides Methods /// /// /// /// /// public override bool Equals(object obj) { if (obj == null || !(obj is Entity)) return false; if (Object.ReferenceEquals(this, obj)) return true; Entity item = (Entity)obj; if (item.IsTransient() || this.IsTransient()) return false; else return item.Id == this.Id; } /// /// /// /// public override int GetHashCode() { if (!IsTransient()) { if (!_requestedHashCode.HasValue) _requestedHashCode = this.Id.GetHashCode() ^ 31; // XOR for random distribution (http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx) return _requestedHashCode.Value; } else return base.GetHashCode(); } /// /// equals operator /// /// left parameter /// right parameter /// true if equals public static bool operator ==(Entity left, Entity right) { if (Object.Equals(left, null)) return (Object.Equals(right, null)) ? true : false; else return left.Equals(right); } /// /// Distinct operator /// /// left parameter /// right parameter /// True if different public static bool operator !=(Entity left, Entity right) { return !(left == right); } } }