イベントソーシング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 nosso
EventSourcingModel
パラ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!
Reference
この問題について(イベントソーシング1:adicionando suporte a eventos ao seu modelo), 我々は、より多くの情報をここで見つけました https://dev.to/wsantosdev/event-sourcing-parte-1-adicionando-suporte-a-eventos-ao-seu-modelo-me6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol