Skip to content

Latest commit

 

History

History
73 lines (52 loc) · 2.11 KB

README.md

File metadata and controls

73 lines (52 loc) · 2.11 KB

#RavenDb.DDD.Core

This project contains core classes and domain services to quickly start modelling your domain

  • AggregateRoot
  • Reference
  • DomainException
  • Primitives
  • Extensions

#Setting up AggregateRootLoader

*step 1. Implement ILoadAggregateRoot

class MyAggregateRootLoader : ILoadAggregateRoot 
{
	public Task<TAggregateRoot> LoadAggregateRootAsync<TAggregateRoot>(string aggregateRootId)
	{
		var currentSession = ... (get current session);
		await currentSettion.LoadAsync<TAggregateRoot>(aggregateRootId);
	}
}

*step 2. Set static AggregateRootLoader

AggregateRootLoader.Current = new MyAggregateRootLoader(...)

#Setting up DomainEvents Domain events are base upon Udi Dahans Domain Events.

In order to support these event types a IPublishDomainEvent must be configured. This can be done by using your favorite IOC Container. Here is an example using CastleWindsor

*Step 1. Register 'ISubscribeTo' classes

container.Register(Classes.FromAssembly(...)
	.BasedOn(typeof(ISubscribeTo<>)
	.WithServiceAllInterfaces()
	.LifeStyleTransient())

*Step 2. Event publishing

class MyEventPublisher : IPublishDomainEvent
{
	IContainer container;

	public async Task Publish<TDomainEvent>(TDomainEvent domainEvent)
	{
		var handlers = container.ResolveAll<ISubscribeTo<TDomainEvent>>();
		foreach (var handler in handlers)
		{
			await handler.Handle(domainEvent);
			
			container.release(handler);
		}
	}
}

*Step 3. Set static DomainEvents

DomainEvents.Current = new MyEventPublisher(container);

#Reference Reference is use to store a path to another aggregate root

#DomainException Domain exceptions should be used whenever a business rule is violated. An example of this could be, that in a context of a trading application the user should not be allowed to create a trade within 24 before delivery and thus a DomainException should be thrown.

#Primitives The primitives namespace contains generic value objects, which can be used to model your domain.

#Extensions The Extensions namespace contains generic extension methods