main
1using System.Collections.Generic;
2using System.Net;
3using System.Threading;
4using System.Windows.Threading;
5using Autofac.Builder;
6using Gorilla.Commons.Infrastructure.Container;
7using Gorilla.Commons.Infrastructure.Logging;
8using gorilla.commons.infrastructure.thirdparty.Autofac;
9using gorilla.commons.infrastructure.thirdparty.Log4Net;
10using gorilla.commons.infrastructure.threading;
11using gorilla.commons.utility;
12using presentation.windows.common;
13using presentation.windows.common.messages;
14using presentation.windows.eventing;
15using presentation.windows.presenters;
16using presentation.windows.views;
17using Rhino.Queues;
18
19namespace presentation.windows.bootstrappers
20{
21 static public class ClientBootstrapper
22 {
23 static public ShellWindow create_window()
24 {
25 var builder = new ContainerBuilder();
26 var registry = new AutofacDependencyRegistryBuilder(builder).build();
27 Resolve.initialize_with(registry);
28 builder.Register(x => registry).As<DependencyRegistry>().SingletonScoped();
29
30 var shell_window = new ShellWindow();
31 builder.Register(x => shell_window).SingletonScoped();
32 builder.Register(x => shell_window).As<RegionManager>().SingletonScoped();
33
34 register_needs_startup(builder);
35
36 // infrastructure
37 builder.Register<Log4NetLogFactory>().As<LogFactory>().SingletonScoped();
38 builder.Register<DefaultMapper>().As<Mapper>().SingletonScoped();
39 builder.RegisterGeneric(typeof(Mapper<,>));
40
41 var manager = new QueueManager(new IPEndPoint(IPAddress.Loopback, 2201), "client.esent");
42 manager.CreateQueues("client");
43 builder.Register(x => new RhinoPublisher("server", 2200, manager)).As<ServiceBus>().SingletonScoped();
44 builder.Register(x => new RhinoReceiver(manager.GetQueue("client"), x.Resolve<CommandProcessor>())).As<RhinoReceiver>().As<Receiver>().SingletonScoped();
45
46 register_presentation_infrastructure(builder);
47 register_presenters(builder);
48 register_for_message_to_listen_for(builder);
49
50 //shell_window.Closed += (o, e) => Resolve.the<ServiceBus>().publish<ApplicationShuttingDown>();
51 shell_window.Closed += (o, e) => Resolve.the<CommandProcessor>().stop();
52 shell_window.Closed += (o, e) => manager.Dispose();
53 shell_window.Closed += (o, e) => Resolve.the<IEnumerable<NeedsShutdown>>();
54
55 Resolve.the<IEnumerable<NeedStartup>>().each(x => x.run());
56 Resolve.the<CommandProcessor>().run();
57 return shell_window;
58 }
59
60 static void register_needs_startup(ContainerBuilder builder)
61 {
62 builder.Register<StartServiceBus>().As<NeedStartup>();
63 builder.Register<ComposeShell>().As<NeedStartup>();
64 builder.Register<ConfigureMappings>().As<NeedStartup>();
65 }
66
67 static void register_presentation_infrastructure(ContainerBuilder builder)
68 {
69 SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext());
70 builder.Register<WpfApplicationController>().As<ApplicationController>().SingletonScoped();
71 builder.Register<WpfPresenterFactory>().As<PresenterFactory>().SingletonScoped();
72 builder.Register<SynchronizedEventAggregator>().As<EventAggregator>().SingletonScoped();
73 //builder.Register(x => AsyncOperationManager.SynchronizationContext);
74 builder.Register(x => SynchronizationContext.Current);
75 builder.Register<AsynchronousCommandProcessor>().As<CommandProcessor>().SingletonScoped();
76 //builder.Register<SynchronousCommandProcessor>().As<CommandProcessor>().SingletonScoped();
77 builder.Register<WPFCommandBuilder>().As<UICommandBuilder>();
78 }
79
80 static void register_presenters(ContainerBuilder builder)
81 {
82 builder.Register<StatusBarPresenter>().SingletonScoped();
83 builder.Register<SelectedFamilyMemberPresenter>().SingletonScoped();
84 builder.Register<AddFamilyMemberPresenter>();
85 builder.Register<AddFamilyMemberPresenter.SaveCommand>();
86 builder.Register<AccountPresenter>();
87 builder.Register<AccountPresenter.ImportTransactionCommand>();
88 builder.Register<CancelCommand>();
89 builder.Register<AddNewDetailAccountPresenter>();
90 builder.Register<AddNewDetailAccountPresenter.CreateNewAccount>();
91 }
92
93 static void register_for_message_to_listen_for(ContainerBuilder builder)
94 {
95 builder.Register<PublishEventHandler<AddedNewFamilyMember>>().As<Handler>();
96 builder.Register<PublishEventHandler<NewAccountCreated>>().As<Handler>();
97 }
98 }
99}