イベントソーシング1:adicionando suporte a eventos ao seu modelo


ああ!
エスト・アーティゴ・ドゥ・プリメイ・デ・モー・プレイク・デ・デ・ウソのパターン・イベント・ソーシング(ES)se vocは、nunca teve contato com oパターン、来ているAromos juntos por aquiに来ます!

Importante! Este artigo foi fortemente inspirado pelo sobre o tema. É uma introdução conceitual ao pattern com menos de 15 minutos. Recomendo que o assista e, em seguida, prossiga com a leitura deste artigo. Como o próprio atenta no vídeo, a compreensão do pattern é simples, mas a implementação é bastante complexa!



イベントソーシングpra quは?
Primeira pergunta que Preisisos NOS Fazerについて
の問題は、レゾルバは、エラードゥda suaのaplicaを持っている.<研究ノート>パラヴェーラ『スー・アップリカ』について
Estado Atual do seu modelo de DOM RUN ' NOアルゴcomo o seguinte
public class PriceAlert
{
    ...
    public bool Active { get; private set; }

    public void Cancel() =>
        Active = false;
}
...
alert.Cancel();
オウムの問題は、アッラーの前置詞の形容詞は、アオプレシアーadicionar auditoria、piaの例証、セリアのepessは、リアのエステfim、e que todos os envolvidosのprojeto se lembrassem de incluir馬のエゴのエステモジュラa cada mudanはde estestado、o que seria um trabalho adicional、tanto para a auditoria em si、Quanto para a Manentenのo e testes.耳鼻咽喉科エーモス・アルゴ・コモ
...
alert.Cancel();
auditService.Audit(alert.Id, DateTime.Now, $"Alerta {alert.Id} cancelado.");
Quadando USAMOSのイベントに必要なサスペンスを行います.
ソーア・ラムnVamos Ver Agora como Alcan PeriodエーモスEste Resultado

Evento : O
OS Eventos s o o os Elementos is o o Estica aadicar sobre nossas Entidades , E como outros componentとしてのAplicaの結果
パラ来るアーモモ、DefiniとしてのVamos Conhecerは、es esデum Eventoを得ます.digo abaixoを確認します.
namespace Lab.EventSourcing.Core
{
    public interface IEvent {}

    public abstract class EventBase : IEvent
    {
        public DateTime When { get; protected set; }

        public EventBase() =>
            When = DateTime.Now;
    }
}
インターフェースE A A ClassseベースAcima、Temos馬Definiは、発生します.インターフェースServirは、como contrato para definir um Evento、e a classeベースパラシュートで降下します.<資料>前置詞としての形容詞

適当なo modelo
アンデスデMais Nada、El - essリオリオadicionarオオ- seuモデルelcheidadeデregistrar夕方.パルス・イスソ,サー・イコンツァーダ,マナス・クラッセベースのエサ・アパゲーダド,セール・イン・セグィンテ
namespace Lab.EventSourcing.Core
{
    public abstract class EventSourcingModel
    {
        private Queue<IEvent> _pendingEvents = new Queue<IEvent>();
        public IEnumerable<IEvent> PendingEvents { get => _pendingEvents.AsEnumerable(); }

        protected void RaiseEvent<TEvent>(TEvent pendingEvent) where TEvent: IEvent
        {
            _pendingEvents.Enqueue(pendingEvent);
            ((dynamic)this).Apply((dynamic)pendingEvent);
        }

        public void Commit() =>
            _pendingEvents.Clear();
    }
}

Nota: Esta é uma implementação bastante simples do suporte a eventos. É comum que se encontre na Internet exemplos associados a DDD, adicionando esse suporte à uma clase base de raíz de agragado e com outras capacidades. No entanto, como o foco por ora é apenas demonstrar o ES, optamos por criar uma implementação restrita a ele e com um mínimo de funcionalidade exigido para este artigo.


アゴラque temos suporte a eventos,vamos実装者nosso modeloエレ・レピュラスの前衛的なものについての一考察
namespace Lab.EventSourcing.PriceAlert
{
    public class PriceAlert : EventSourcingModel
    {
        public Guid Id { get; private set; }
        public string Symbol { get; private set; }
        public decimal TargetPrice { get; private set; }
        public DateTime TriggeredAt { get; private set; }
        public bool Active { get; private set; }

        public static PriceAlert Create(string symbol, decimal price)
        {
            if(string.IsNullOrWhiteSpace(symbol))
                throw new ArgumentException("A symbol must be provided.", nameof(symbol));

            if(targetPrice <= 0m)
                throw new ArgumentException("A target price greater than zero must be provided.", nameof(targetPrice));

            var alert = new PriceAlert();
            alert.RaiseEvent(new PriceAlertCreated(new Guid(), symbol, price));

            return alert;
        }

        public void Trigger()
        {
            if(TriggeredAt > DateTime.MinValue)
                throw new InvalidOperationException("A price alert cannot be triggered more than once.");

            if(!Active)
                throw new InvalidOperationException("An inactive price alert cannot be triggered.");

            RaiseEvent(new PriceAlertTriggered());
        }

        public void Cancel()
        {
            if(TriggeredAt > DateTime.MinValue)
                throw new InvalidOperationException("A triggered price alert cannot be cancelled.");

            if(!Active)
                throw new InvalidOperationException("A price alert cannot be cancelled more than once.");

            RaiseEvent(new PriceAlertCancelled());
        }

        internal void Apply(PriceAlertCreated pendingEvent) =>
            (Id, Symbol, TargetPrice, Active) = (pendingEvent.Id, pendingEvent.Symbol, pendingEvent.TargetPrice, true);

        internal void Apply(PriceAlertTriggered pendingEvent) =>
            (TriggeredAt, Active) = (pendingEvent.When, false);

        internal void Apply(PriceAlertCancelled pendingEvent) =>
            Active = false;
    }

    public class PriceAlertCreated : EventBase 
    {
        public Guid Id { get; private set; }
        public string Symbol { get; private set; }
        public decimal TargetPrice { get; private set; }

        public PriceAlertCreated(Guid id, string symbol, decimal targetPrice) =>
            (Id, Symbol, TargetPrice) = (id, symbol, targetPrice);
    }

    public class PriceAlertTriggered : EventBase {  }

    public class PriceAlertCancelled : EventBase {  }
}

vamos審査官nosso modelo paraエンフェンダーcomo else se comunica com o es .
レプリク、アンテデtudo、エレestende nossoEventSourcingModel パラseナールCapazデGerar Eventos.エムセゲナ、ヴェーモスの工場の方法PriceAlert E adicionaは、エヌum EventoデCria Staes - o o com SEUS Dados Esseniiais(ID、C通digoデネゴシアン・ソプラオオe pre - o - alvo).Edo Segia Temos um m To do to do do do do do aciona o disparoTrigger , レジデンスのためのコンベンションのためのコンベンションTriggeredAt カサn散策o tenhaのsidoの前に.E , Por fim , temos um m doo de cancelamentoCancel <研究ノート>地方自治体における地方自治体の就労意識
ロゴAPは、nosso modelo、temos os eventos porエレsuportadosです.Toss s o o bastante simples、e apenas oデcriaは、oを占めます.

PRアウスパスパソス
アゴラque temos nososo modelo suportando eventos,vamosのonno no prは,xyo artigo como fazemos sua persistを得た.
コモディントは、o o o o o o o o o o o o o oをします.
E、PorのFIM、TE LANのclonar クラスProdadas Aqui e Criar Tested de UnidadeパラConnir se O Estado doクラスとしてのo o projeto comは、AOS Eventos Registradosに対応しますか?
カゴTenhaアルマdは、ビダsobre o conteは、エレAquiで私のAvise pelos comentを得ます.se gostou destaイントロデュは、o o o、私dedexeサーベルpelos indicadoresです.
おお、o o prに、Ximo artigo!