main
1using System.Collections.Generic;
2using System.Diagnostics;
3using System.Net;
4using Autofac.Builder;
5using Gorilla.Commons.Infrastructure.Container;
6using Gorilla.Commons.Infrastructure.Logging;
7using gorilla.commons.infrastructure.thirdparty.Autofac;
8using gorilla.commons.infrastructure.thirdparty.Log4Net;
9using gorilla.commons.infrastructure.threading;
10using gorilla.commons.utility;
11using presentation.windows.common;
12using presentation.windows.server.handlers;
13using presentation.windows.server.orm;
14using presentation.windows.server.orm.nhibernate;
15using Rhino.Queues;
16using ISession = NHibernate.ISession;
17using ISessionFactory = NHibernate.ISessionFactory;
18
19namespace presentation.windows.server
20{
21 public class ServerBootstrapper
22 {
23 static public void run()
24 {
25 new ConfigureApplicationDirectory().run();
26
27 var builder = new ContainerBuilder();
28 var registry = new AutofacDependencyRegistryBuilder(builder).build();
29 Resolve.initialize_with(registry);
30
31 builder.Register(x => registry).As<DependencyRegistry>().SingletonScoped();
32 //needs startups
33 builder.Register<StartServiceBus>().As<NeedStartup>();
34 builder.Register<ConfigureMappings>().As<NeedStartup>();
35
36 // infrastructure
37 builder.Register<Log4NetLogFactory>().As<LogFactory>().SingletonScoped();
38 builder.Register<DefaultMapper>().As<Mapper>().SingletonScoped();
39
40 var manager = new QueueManager(new IPEndPoint(IPAddress.Loopback, 2200), "server.esent");
41 manager.CreateQueues("server");
42 builder.Register(x => new RhinoPublisher("client", 2201, manager)).As<ServiceBus>().SingletonScoped();
43 builder.Register(x => new RhinoReceiver(manager.GetQueue("server"), x.Resolve<CommandProcessor>())).As<RhinoReceiver>().As<Receiver>().SingletonScoped();
44
45 var session_factory = new NHibernateBootstrapper().fetch();
46 builder.Register<ISessionFactory>(x => session_factory).SingletonScoped();
47 builder.Register<ISession>(x => current_session(x));
48 builder.Register<NHibernateUnitOfWorkFactory>().As<IUnitOfWorkFactory>();
49 builder.Register<IContext>(x => create_application_context()).SingletonScoped();
50
51 register_handlers(builder);
52 register_repositories(builder);
53
54 Resolve.the<IEnumerable<NeedStartup>>().each(x => x.run());
55 Resolve.the<CommandProcessor>().run();
56 }
57
58 static void register_handlers(ContainerBuilder builder)
59 {
60 builder.Register<SynchronousCommandProcessor>().As<CommandProcessor>().SingletonScoped();
61 builder.Register<AddNewFamilyMemberHandler>().As<Handler>();
62 builder.Register<FindAllFamilyHandler>().As<Handler>();
63 builder.Register<CreateNewDetailAccountHandler>().As<Handler>();
64 builder.Register<ShutdownApplicationCommand>().As<Handler>();
65
66 }
67
68 static void register_repositories(ContainerBuilder builder)
69 {
70 builder.Register<NHibernatePersonRepository>().As<PersonRepository>().FactoryScoped();
71 builder.Register<NHibernateAccountRepository>().As<AccountRepository>().FactoryScoped();
72 }
73
74 static IContext create_application_context()
75 {
76 return new ContextFactory().create_for(new PerThreadScopedStorage(new CurrentThread()));
77 }
78
79 static ISession current_session(Autofac.IContext x)
80 {
81 var context = x.Resolve<IContext>();
82 var session = context.value_for(new TypedKey<ISession>());
83 if (null == session) Debugger.Break();
84 return session;
85 }
86 }
87}