Skip to content

Instantly share code, notes, and snippets.

@MarkNijhof
Created August 1, 2010 21:01
Show Gist options
  • Save MarkNijhof/503764 to your computer and use it in GitHub Desktop.
Save MarkNijhof/503764 to your computer and use it in GitHub Desktop.
void IEventProvider.LoadFromHistory(IEnumerable<IDomainEvent> domainEvents)
{
if (domainEvents.Count() == 0)
return;
foreach (var domainEvent in domainEvents)
{
apply(domainEvent.GetType(), domainEvent);
}
Version = domainEvents.Last().Version;
EventVersion = Version;
}
namespace Fohjin.DDD.EventStore
{
public interface IEntityEventProvider
{
void Clear();
void LoadFromHistory(IEnumerable<IDomainEvent> domainEvents);
void HookUpVersionProvider(Func<int> versionProvider);
IEnumerable<IDomainEvent> GetChanges();
Guid Id { get; }
}
}
namespace Fohjin.DDD.EventStore
{
public interface IRegisterEntities
{
void RegisterEntityEventProvider(IEntityEventProvider entityEventProvider);
}
}
void IRegisterEntities.RegisterEntityEventProvider(IEntityEventProvider entityEventProvider)
{
entityEventProvider.HookUpVersionProvider(GetNewEventVersion);
_entityEventProviders.Add(entityEventProvider);
}
namespace Fohjin.DDD.Domain
{
public class EntityList<TEntity> : List<TEntity> where TEntity : IEntityEventProvider
{
private readonly IRegisterEntities _aggregateRoot;
public EntityList(IRegisterEntities aggregateRoot)
{
_aggregateRoot = aggregateRoot;
}
public new void Add(TEntity entity)
{
_aggregateRoot.RegisterEntityEventProvider(entity);
base.Add(entity);
}
}
}
private void registerEvents()
{
// Registration of Aggregate Root event handlers
RegisterEvent<BankCardWasReportedStolenEvent>(onAnyEventForABankCard);
RegisterEvent<BankCardWasCanceledByCLientEvent>(onAnyEventForABankCard);
}
private void onAnyEventForABankCard(IDomainEvent domainEvent)
{
IEntityEventProvider bankCard;
if (!_bankCards.TryGetValueById(domainEvent.AggregateId, out bankCard))
throw new NonExistingBankCardException("The requested bank card does not exist!");
bankCard.LoadFromHistory(new[] { domainEvent });
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment