-
Notifications
You must be signed in to change notification settings - Fork 2
/
SimpleDispatcher.cs
35 lines (30 loc) · 1.17 KB
/
SimpleDispatcher.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using Lokad.Cqrs;
using Lokad.Cqrs.Envelope;
using Lokad.Cqrs.TapeStorage;
namespace Recipes.Wires
{
public class SimpleDispatcher
{
private readonly AggregateFactory _aggregateFactory;
private readonly IEnvelopeStreamer _serializer;
private readonly ITapeStream _tapeStream;
public SimpleDispatcher(AggregateFactory aggregateFactory, IEnvelopeStreamer serializer, ITapeStream tapeStream)
{
_aggregateFactory = aggregateFactory;
_serializer = serializer;
_tapeStream = tapeStream;
}
public void DispatchCommand(object command, Action<EnvelopeBuilder> builder = null)
{
var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString());
envelopeBuilder.AddItem(command);
if (builder != null) builder(envelopeBuilder);
var envelope = envelopeBuilder.Build();
var data = _serializer.SaveEnvelopeData(envelope);
if (!_tapeStream.TryAppend(data))
throw new InvalidOperationException("Failed to record domain log");
_aggregateFactory.Dispatch(envelope);
}
}
}