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}