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}