Skip to content
This repository

Domain Driven Design with CQRS, Event Sourcing, MassTransit, RavenDB, RabbitMQ and C# and F#.

branch: master

This branch is 0 commits ahead and 0 commits behind master

Merge pull request #28 from mbp/update-packages

Merging mbp's pull request to update packages in master branch. Have a look at the dev branch for newer logical code that still is in need of updating packages.
latest commit b40e92f5c8
Henrik Feldt authored
Octocat-spinner-32 Docs demos in f# October 25, 2011
Octocat-spinner-32 buildscripts correct sln file location February 15, 2012
Octocat-spinner-32 src Add methods required in new IServiceBus interface. June 24, 2013
Octocat-spinner-32 tools added buildscripts February 15, 2012
Octocat-spinner-32 .gitignore updated packages done! tested. March 16, 2012
Octocat-spinner-32 .semver Release v1.0.1 March 23, 2012
Octocat-spinner-32 Gemfile added buildscripts February 15, 2012
Octocat-spinner-32 Gemfile.lock added buildscripts February 15, 2012
Octocat-spinner-32 README.md made Command an interface, made DomainEvent an interface, made the sa… February 17, 2012
Octocat-spinner-32 Rakefile.rb added buildscripts February 15, 2012
README.md

Documently

This is a sample application showcasing a DDD/CQRS architecture with Event Sourcing with a number of excellent open source software technologies. I (Henrik) want to make it easy for people to get started with this architecture - why not try to maximize developer happiness and make the world a better place and learn it yourself while you're at it?

Some of the concepts you can learn include:

  • Creating a Caliburn Micro WPF client with a ribbon, which uses the EventAggregator pattern for its reactive UI and wires itself up with Castle Windsor.
  • How to configure MassTransit with RabbitMQ
  • How to write unit-tests for aggregate roots based on simple invoke-method, read resulting events.
  • How to use CommonDomain to publish committed events
  • Getting started with RavenDB
  • Getting started with RabbitMQ
  • Doing application validation logic (non-emptyness, etc) with FluentValidation
  • How to use TopShelf with the DomainService (in daemon/Windows Service mode, not hosted).

Currently incomplete but upcoming features:

  • Properly handling de-duplication of events on the read-side
  • Properly handling replaying of the event store from the last received point forward on the read-side
  • Finishing implementing the Document-part of the App and WpfClient
  • Running a WPF, a iOS phone and console application side-by-side and having the system work as a whole.
  • Implement the indexing logic for the Document-part of the domain using SVMs.

The above tasks are rather easy to accomplish, they just take a few hours worth of time - so if you feel up for learning the concepts of CQRS and Event Sourcing, feel free to have a go and send a pull-request!

Getting started

First, start the event-store and view-store - RavenDB.Server, in this case. It can be found in src\packages\RavenDB.1.x.x\server. Once this is done, install RabbitMQ

There are two sample clients: one WPF Client with a nice UI and one console application for a quick start. Before using them, you need to compile the solution and start the Documently.Domain.Service console application. This is the domain service that handles the domain logic and broadcasts the (domain) events.

Once both RavenDB and the Domain Service are started without error messages, start one of the clients, or both and try it out!

Note: When starting Domain Service the first time you will need to run it as admin to avoid getting error messages from MassTransit's Performance Counters - or you can run it and just ignore those messages.

Credits

The sample is based on code by:

CommonDomain documentation at https://github.com/haf/CommonDomain/wiki/Intro-to-Common-Domain You can find more information about CQRS in the wiki: https://github.com/haf/Documently/wiki

Something went wrong with that request. Please try again.