private Configuration()
        {
            _bus = new MessageBus();
            var eventStore = new SqlEventStore(_bus);
            var repository = new DomainRepository(eventStore);

            var commandService = new AccountApplicationService(repository);

            _bus.RegisterHandler <RegisterAccountCommand>(commandService.Handle);
            _bus.RegisterHandler <DebitAccountCommand>(commandService.Handle);
            _bus.RegisterHandler <UnlockAccountCommand>(commandService.Handle);

            var infoProjection = new AccountInfoProjection();

            _bus.RegisterHandler <AccountRegisteredEvent>(infoProjection.Handle);
            _bus.RegisterHandler <AccountLockedEvent>(infoProjection.Handle);
            _bus.RegisterHandler <AccountUnlockedEvent>(infoProjection.Handle);

            var balanceProjection = new AccountBalanceProjection();

            _bus.RegisterHandler <AccountRegisteredEvent>(balanceProjection.Handle);
            _bus.RegisterHandler <AccountDebitedEvent>(balanceProjection.Handle);

            var notification = new NotificationProjection();

            _bus.RegisterHandler <AccountRegisteredEvent>(notification.Handle);
            _bus.RegisterHandler <AccountDebitedEvent>(notification.Handle);
            _bus.RegisterHandler <AccountLockedEvent>(notification.Handle);
            _bus.RegisterHandler <AccountUnlockedEvent>(notification.Handle);
            _bus.RegisterHandler <OverdrawAttemptedEvent>(notification.Handle);

            _readModel = new ReadModelFacade(balanceProjection, infoProjection, notification);

            var events = eventStore.GetAllEventsEver();

            _bus.Publish(events);
        }
 public ReadModelFacade(AccountBalanceProjection balance, AccountInfoProjection info, NotificationProjection notification)
 {
     AccountBalances = balance.AccountBalances;
     AccountInfos    = info.AccountInfos;
     Notifications   = notification.Notifications;
 }