// ========================================================================== // DomainObjectBase.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== using System; using System.Collections.Generic; using Squidex.Infrastructure.CQRS.Events; namespace Squidex.Infrastructure.CQRS { public abstract class DomainObjectBase : IAggregate, IEquatable { private readonly List> uncomittedEvents = new List>(); private readonly Guid id; private int version; public int Version { get { return version; } } public Guid Id { get { return id; } } protected DomainObjectBase(Guid id, int version) { Guard.NotEmpty(id, nameof(id)); Guard.GreaterEquals(version, -1, nameof(version)); this.id = id; this.version = version; } protected abstract void DispatchEvent(Envelope @event); private void ApplyEventCore(Envelope @event) { DispatchEvent(@event); version++; } protected void RaiseEvent(IEvent @event) { RaiseEvent(Envelope.Create(@event)); } protected void RaiseEvent(Envelope @event) where TEvent : class, IEvent { Guard.NotNull(@event, nameof(@event)); uncomittedEvents.Add(@event.To()); ApplyEventCore(@event.To()); } void IAggregate.ApplyEvent(Envelope @event) { ApplyEventCore(@event); } void IAggregate.ClearUncommittedEvents() { uncomittedEvents.Clear(); } public ICollection> GetUncomittedEvents() { return uncomittedEvents; } public override int GetHashCode() { return id.GetHashCode(); } public override bool Equals(object obj) { return Equals(obj as IAggregate); } public bool Equals(IAggregate other) { return other != null && other.Id.Equals(id); } } }