IContainer InitializeContainer() { ContainerBuilder builder = new ContainerBuilder(); builder.Register(c => { var bus = new InMemoryCommandMessageBus(); bus.RegisterHandler <ImportRepository>(c.Resolve <ImportRepositoryCommandHandler>().Handle); bus.RegisterHandler <TagSourcefile>(c.Resolve <TagSourcefileCommandHandler>().Handle); return(bus); }) .As <ICommandSender>() .SingleInstance(); builder .Register(c => { var bus = new InMemoryEventBus(); bus.RegisterHandler <RepositoryImported>(c.Resolve <RepositoryImportedEventHandler>().Handle); bus.RegisterHandler <SourcefileImported>(c.Resolve <SourcefileImportedEventHandler>().Handle); bus.RegisterHandler <SourcefileTagged>(c.Resolve <SourcefileTaggedEventHandler>().Handle); return(bus); }) .As <IEventPublisher>() .SingleInstance(); builder.RegisterType <ImportRepositoryCommandHandler>().SingleInstance(); builder.RegisterType <TagSourcefileCommandHandler>().SingleInstance(); builder.RegisterType <QueryDatabase>().As <IQueryDatabase>().SingleInstance(); builder.RegisterType <GithubReadModel>().As <IGithubReadModel>().SingleInstance(); builder.RegisterType <RepositoryImportedEventHandler>(); builder.RegisterType <SourcefileImportedEventHandler>(); builder.RegisterType <SourcefileTaggedEventHandler>(); builder.RegisterType <MessengerAdapter>().As <IMessengerAdapter>().SingleInstance(); builder.Register <Func <RepositoryListViewModel> >(c => { IComponentContext cc = c.Resolve <IComponentContext>(); return(() => cc.Resolve <RepositoryListViewModel>()); }); builder.Register <Func <RepositoryListDto, RepositoryViewModel> >(c => { IComponentContext cc = c.Resolve <IComponentContext>(); return(repository => cc.Resolve <RepositoryViewModel>(new NamedParameter("repository", repository))); }); builder.Register <Func <SourcefileDto, SourcefileViewModel> >(c => { IComponentContext cc = c.Resolve <IComponentContext>(); return(sourcefile => cc.Resolve <SourcefileViewModel>(new NamedParameter("sourcefile", sourcefile))); }); builder.RegisterType <ImportRepositoryCommand>(); builder .RegisterType <GithubRepositoryRepository>() .As <IGithubRepositoryRepository>() .SingleInstance(); builder.RegisterType <RavenDbEventStore>().As <IEventStore>().SingleInstance(); builder.RegisterType <MainWindowViewModel>(); builder.RegisterType <RepositoryListViewModel>(); builder.RegisterType <RepositoryViewModel>(); builder.RegisterType <SourcefileViewModel>(); builder.RegisterInstance <IDocumentStore>(CreateRavenDbDocumentStore()).SingleInstance(); return(builder.Build()); }