私はAkka.netでCQRSとEvent Sourcingを適用する方法に興味があります。私はすでにAkka.PersistenceにES部分を配達していることに気づいた。Akka.netとAkka.PersistenceでCQRSのEventBusを適用する方法
私が理解している限り、コマンドハンドラとAggergateRootは、単一クラスのReceivePersistentActorで表すことができます。私は
public abstract class AggregateRoot<TState> : ReceivePersistentActor
{
private readonly Func<TState, bool> shouldSafeSnapShot;
protected AggregateRoot(TState state, Func<TState, bool> shouldSafeSnapShot)
{
if (state == null) throw new ArgumentNullException(nameof(state));
if (shouldSafeSnapShot == null) throw new ArgumentNullException(nameof(shouldSafeSnapShot));
var path = this.Self.Path;
this.PersistenceId = $"{path.Parent.Name}/{path.Name}";
this.State = state;
this.shouldSafeSnapShot = shouldSafeSnapShot;
}
public sealed override string PersistenceId { get; }
protected TState State { get; }
protected void Emit<TEvent>(TEvent e, Action<TEvent> apply = null)
{
this.Persist(e,
@event =>
{
// update state
apply?.Invoke(@event);
// safe snapshot or so...
this.SaveSnapshotIfRequired();
// publish to event bus?
Context.System.EventStream.Publish(e);
});
}
private void SaveSnapshotIfRequired()
{
var state = this.State;
if (this.shouldSafeSnapShot(state))
{
this.SaveSnapshot(state);
}
}
}
がない私はEventBusの上にイベントを送りたい...(ここでは完了していない)そのための基本クラスを持っており、アッカは、それが行われている方法に合うかもしれないパッケージだ以内に何かを持っているようです他のCQRSフレームワーク(EventBusの抽象概念は
NCqrs、
Inceptum)またはグレゴリー・ヤングの簡単なサンプル
hereと比較してください。
// publish to event bus?
Context.System.EventStream.Publish(e);
しかし、AggregateRootドメインオブジェクトの俳優の中eventbusの実装を知っている私には奇妙なようです。私は俳優の子供に責任を置くか、実装を切り替えるために使用されるIAbstractEventBusインターフェースのようなものを注入することができますが、永続化してすべての加入者に通知するのはAggregateRootの責任ではないと思います!? しかし、ESの部分は、俳優に結合されているようです。
Akka.netとAkka.Persistenceでこれを行う典型的な方法は何ですか?どのデザインアイデアをどのように分割するか?理想主義の世界では
私はAkka.netのIEventAdapterインターフェイスをアップつまずいたが、私はこれが正しい道(またはダークサイド)に私をもたらしわからないんだけど...
public class SomeEventAdapter : IEventAdapter
{
public object ToJournal(object evt)
{
return evt; // should I add the event emitter here?
// but is this already stored now? hmmm
}
}