main
 1using System;
 2using Autofac;
 3using Autofac.Builder;
 4using Autofac.Modules;
 5using Gorilla.Commons.Infrastructure.Container;
 6using gorilla.commons.infrastructure.thirdparty.autofac;
 7using gorilla.commons.infrastructure.thirdparty.Castle.DynamicProxy;
 8using gorilla.commons.utility;
 9
10namespace gorilla.commons.infrastructure.thirdparty.Autofac
11{
12    public class AutofacDependencyRegistryBuilder : DependencyRegistration
13    {
14        readonly ContainerBuilder builder;
15        readonly Func<IContainer> container;
16
17        public AutofacDependencyRegistryBuilder(ContainerBuilder builder)
18        {
19            this.builder = builder;
20            builder.RegisterModule(new ImplicitCollectionSupportModule());
21            builder.SetDefaultScope(InstanceScope.Factory);
22            container = () => builder.Build();
23            container = container.memorize();
24        }
25
26        public void singleton<Contract, Implementation>() where Implementation : Contract
27        {
28            builder.Register<Implementation>().As<Contract>().SingletonScoped();
29        }
30
31        public void singleton(Type contract, Type implementation)
32        {
33            builder.Register(implementation).As(contract).SingletonScoped();
34        }
35
36        public void singleton<Contract>(Func<Contract> instance_of_the_contract)
37        {
38            builder
39                .Register(x => instance_of_the_contract())
40                .As<Contract>()
41                .SingletonScoped();
42        }
43
44        public void transient<Contract, Implementation>() where Implementation : Contract
45        {
46            transient(typeof (Contract), typeof (Implementation));
47        }
48
49        public void transient(Type contract, Type implementation)
50        {
51            if (contract.is_a_generic_type())
52                builder.RegisterGeneric(implementation).As(contract).FactoryScoped();
53            else
54                builder.Register(implementation).As(contract).FactoryScoped();
55        }
56
57        public void transient<Contract>(Func<Contract> factory_method)
58        {
59            builder.Register(x => factory_method()).As<Contract>().FactoryScoped();
60        }
61
62        public void proxy<T>(Configuration<ProxyBuilder<T>> configuration, Func<T> target)
63        {
64            var proxy_builder = new CastleDynamicProxyBuilder<T>();
65            configuration.configure(proxy_builder);
66            builder.Register(x => proxy_builder.create_proxy_for(target)).As<T>().FactoryScoped();
67        }
68
69        public void proxy<T, Configuration>(Func<T> target)
70            where Configuration : Configuration<ProxyBuilder<T>>, new()
71        {
72            proxy(new Configuration(), target);
73        }
74
75        public DependencyRegistry build()
76        {
77            return new AutofacDependencyRegistry(container);
78        }
79    }
80}