Skip to content

Instantly share code, notes, and snippets.

public class UserAggregate : Aggregate
{
private readonly UserAggregateProjector projector;
public string Username { get; internal set; } = String.Empty;
public string Email { get; internal set; } = String.Empty;
public UserAggregate()
{
this.projector = new UserAggregateProjector(this);
}
public abstract class Aggregate
{
private readonly List<Event> newEvents = new List<Event>();
public Guid Id { get; internal set; }
public IEnumerable<Event> NewEvents => this.newEvents.AsReadOnly();
public void Replay(List<Event> events)
{
foreach (var @event in events)
Play(@event);
public class UserAggregateProjector
{
private readonly UserAggregate projection;
public UserAggregateProjector(UserAggregate projection)
{
this.projection = projection;
}
protected void When(UserCreatedEvent e)
public class UserAggregate : Aggregate
{
public string Username { get; private set; } = String.Empty;
public string Email { get; private set; } = String.Empty;
protected void When(UserCreatedEvent e)
{
this.Username = e.Username;
this.Email = e.EmailAddress;
this.Id = e.Id;
public Task Handle(ChangeUsernameCommand command) =>
this.helper.Handle(command.Id, aggregate =>
{
if (Guid.Empty.Equals(aggregate.Id) || string.IsNullOrWhiteSpace(command.Username))
return;
var usernameChanged = new UsernameChangedEvent(command.Username, aggregate.Id, aggregate.Username);
aggregate.Emit(usernameChanged);
});
public class ChangeUsernameCommandHandler : IAsyncRequestHandler<ChangeUsernameCommand>
{
private readonly CommandHandlersHelper<UserAggregate> helper;
public ChangeUsernameCommandHandler(CommandHandlersHelper<UserAggregate> helper)
{
this.helper = helper;
}
public Task Handle(ChangeUsernameCommand command) =>
using System;
using System.Threading.Tasks;
public class CommandHandlersHelper<T> where T : Aggregate
{
private readonly AggregateRepository repo;
private readonly EventDispatcher eventDispatcher;
public CommandHandlersHelper(AggregateRepository repo, EventDispatcher eventDispatcher)
{
@horsdal
horsdal / change-username-aggregate.cs
Last active October 23, 2017 20:17
Change username methods on aggregate
public class UserAggregate : Aggregate
{
private string username = String.Empty;
private string email = String.Empty;
public void Create(CreateUserCommand command) { ... } // from the first post
protected void When(UserCreatedEvent e) { ... } // from the first post
public void ChangeUsername(ChangeUsernameCommand command)
{
@horsdal
horsdal / change-username-command-handler.cs
Created October 23, 2017 20:14
Handler for the change username command
using System;
using System.Threading.Tasks;
using EventReplay;
using EventReplay.Infrastructure;
using MediatR;
public class ChangeUsernameCommandHandler : IAsyncRequestHandler<ChangeUsernameCommand>
{
private readonly AggregateRepository repo;
private readonly EventDispatcher eventDispatcher;
@horsdal
horsdal / change-username-command.cs
Created October 23, 2017 20:13
The second command
public class ChangeUsernameCommand : IRequest
{
public Guid Id { get; }
public string Username { get; }
public ChangeUsernameCommand(Guid id, string username)
{
this.Id = id;
this.Username = username;
}