main
1using System.Collections.Generic;
2using System.Threading;
3using System.Windows;
4using System.Windows.Threading;
5using Autofac;
6using gorilla.infrastructure.container;
7using gorilla.infrastructure.threading;
8using gorilla.utility;
9using solidware.financials.infrastructure;
10using solidware.financials.infrastructure.eventing;
11using solidware.financials.messages;
12using solidware.financials.service;
13using solidware.financials.service.handlers;
14using solidware.financials.service.orm;
15using solidware.financials.windows.ui.handlers;
16using solidware.financials.windows.ui.presenters;
17using solidware.financials.windows.ui.presenters.specifications;
18using solidware.financials.windows.ui.views;
19using utility;
20using Timer = gorilla.infrastructure.threading.Timer;
21
22namespace solidware.financials.windows.ui.bootstrappers
23{
24 static public class Bootstrapper
25 {
26 static public Window create_window()
27 {
28 var builder = new ContainerBuilder();
29
30 //var shell_window = new ShellWindow();
31 var shell_window = new Shell();
32 builder.Register(x => shell_window).SingleInstance();
33 builder.Register(x => shell_window).As<RegionManager>().SingleInstance();
34
35 register_needs_startup(builder);
36
37 // infrastructure
38 //builder.Register<Log4NetLogFactory>().As<LogFactory>().SingleInstance();
39 builder.RegisterType<DefaultMapper>().As<Mapper>().SingleInstance();
40 //builder.RegisterGeneric(typeof (Mapper<,>));
41 builder.RegisterType<InMemoryServiceBus>().As<ServiceBus>().SingleInstance();
42 builder.RegisterGeneric(typeof (IfFamilyMemberIsSelected<>));
43
44 register_presentation_infrastructure(builder);
45 register_presenters(builder);
46 register_for_message_to_listen_for(builder);
47 server_registration(builder);
48
49 builder.RegisterType<StopEssentialServices>().As<NeedsShutdown>();
50
51 shell_window.Closed += (o, e) =>
52 {
53 Resolve.the<IEnumerable<NeedsShutdown>>().each(x => x.run());
54 };
55
56 Resolve.initialize_with(new AutofacDependencyRegistry(builder));
57 Resolve.the<IEnumerable<NeedStartup>>().each(x => x.run());
58 Resolve.the<CommandProcessor>().run();
59 return shell_window;
60 }
61
62 static void register_needs_startup(ContainerBuilder builder)
63 {
64 builder.RegisterType<ComposeShell>().As<NeedStartup>();
65 builder.RegisterType<ConfigureMappings>().As<NeedStartup>();
66 builder.RegisterType<WireUpSubscribers>().As<NeedStartup>();
67 }
68
69 static void register_presentation_infrastructure(ContainerBuilder builder)
70 {
71 SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext());
72 builder.RegisterType<WPFApplicationController>().As<ApplicationController>().SingleInstance();
73 builder.RegisterType<WPFDialogLauncher>().As<DialogLauncher>().SingleInstance();
74 builder.RegisterType<WPFPresenterFactory>().As<PresenterFactory>().SingleInstance();
75 builder.RegisterType<SynchronizedEventAggregator>().As<EventAggregator>().SingleInstance();
76 //builder.Register(x => AsyncOperationManager.SynchronizationContext);
77 builder.Register(x => SynchronizationContext.Current);
78 builder.RegisterType<AsynchronousCommandProcessor>().As<CommandProcessor>().SingleInstance();
79 //builder.Register<SynchronousCommandProcessor>().As<CommandProcessor>().SingleInstance();
80 builder.RegisterType<WPFCommandBuilder>().As<UICommandBuilder>();
81 builder.RegisterType<InMemoryApplicationState>().As<ApplicationState>().SingleInstance();
82
83 builder.RegisterType<IntervalTimer>().As<Timer>().SingleInstance();
84 }
85
86 static void register_presenters(ContainerBuilder builder)
87 {
88 builder.RegisterType<CancelCommand>();
89
90 builder.RegisterType<StatusBarPresenter>().SingleInstance();
91
92 builder.RegisterType<ButtonBarPresenter>().SingleInstance();
93
94 builder.RegisterType<AddFamilyMemberPresenter>();
95 builder.RegisterType<AddFamilyMemberPresenter.SaveCommand>();
96
97 builder.RegisterType<AddNewIncomeViewModel>();
98 builder.RegisterType<AddNewIncomeViewModel.AddIncomeCommand>();
99 builder.RegisterType<IfFamilyMemberIsSelected<AddNewIncomeViewModel>>();
100
101 builder.RegisterType<TaxSummaryPresenter>();
102
103 builder.RegisterType<DisplayCanadianTaxInformationViewModel>();
104
105 builder.RegisterType<StockWatchPresenter>();
106 builder.RegisterType<StockWatchPresenter.AddSymbolCommand>();
107 builder.RegisterType<StockWatchPresenter.RefreshStockPricesCommand>();
108
109 builder.RegisterType<AddNewStockSymbolPresenter>();
110 builder.RegisterType<AddNewStockSymbolPresenter.AddCommand>();
111 builder.RegisterType<AddNewStockSymbolPresenter.IsValid>();
112
113 builder.RegisterType<StockViewModel.MoreCommand>();
114
115 builder.RegisterType<SingleStockPresenter>();
116 builder.RegisterType<SingleStockPresenter.Factory>();
117 }
118
119 static void register_for_message_to_listen_for(ContainerBuilder builder)
120 {
121 builder.RegisterType<PublishEventHandler<AddedNewFamilyMember>>().As<Handles<AddedNewFamilyMember>>();
122 builder.RegisterType<PublishEventHandler<IncomeMessage>>().As<Handles<IncomeMessage>>();
123 builder.RegisterType<PublishEventHandler<CurrentStockPrice>>().As<Handles<CurrentStockPrice>>();
124 builder.RegisterType<PublishEventHandler<StartWatchingSymbol>>().As<Handles<StartWatchingSymbol>>();
125 }
126
127 static void server_registration(ContainerBuilder builder)
128 {
129 //builder.RegisterType<InMemoryDatabase>().As<PersonRepository>().SingleInstance();
130 builder.RegisterType<DB4OPersonRepository>().As<PersonRepository>().SingleInstance();
131 builder.RegisterType<ScopedContext>().As<Context>().SingleInstance();
132 //builder.Register(x => new SimpleContext(new Hashtable())).As<Context>().SingleInstance();
133 builder.RegisterType<PerThreadScopedStorage>().As<ScopedStorage>();
134 builder.RegisterType<CurrentThread>().As<ApplicationThread>();
135 builder.Register(x =>
136 {
137 return Lazy.load(() =>
138 {
139 var context = Resolve.the<Context>();
140 var key = new TypedKey<Connection>();
141 return context.value_for(key);
142 });
143 });
144
145 var unit_of_work_interceptor = new UnitOfWorkInterceptor(new DB40UnitOfWorkFactory(new DB4OConnectionFactory(), Lazy.load<Context>()));
146 builder.RegisterProxy<Handles<FamilyMemberToAdd>, AddNewFamilyMemberHandler>(unit_of_work_interceptor);
147 builder.RegisterProxy<Handles<FindAllFamily>, FindAllFamilyHandler>(unit_of_work_interceptor);
148 builder.RegisterProxy<Handles<FindAllIncome>, FindAllIncomeHandler>(unit_of_work_interceptor);
149 builder.RegisterProxy<Handles<AddIncomeCommandMessage>, AddIncomeCommandMessageHandler>(unit_of_work_interceptor);
150
151 var run_in_background = new RunInBackgroundInterceptor(Lazy.load<CommandProcessor>());
152 builder.RegisterProxy<Handles<StockPriceRequestQuery>, StockPriceRequestQueryHandler>(run_in_background);
153
154 builder.RegisterType<ConfigureServiceMappings>().As<NeedStartup>();
155
156 //builder.RegisterType<StubLookupService>().As<StockPriceLookupService>();
157 builder.RegisterType<GoogleLookupService>().As<StockPriceLookupService>();
158
159 new DB4OBootstrapper().run();
160 }
161 }
162}