master
 1using Castle.MicroKernel.Registration;
 2using Castle.Windsor;
 3using Notepad.Infrastructure.Extensions;
 4
 5namespace Notepad.Infrastructure.Container.Windsor {
 6    public interface IWindsorContainerFactory {
 7        IWindsorContainer Create();
 8    }
 9
10    public class WindsorContainerFactory : IWindsorContainerFactory {
11        private static IWindsorContainer container;
12        private IComponentExclusionSpecification criteriaToSatisfy;
13
14        public WindsorContainerFactory() : this(new ComponentExclusionSpecification()) {}
15
16        public WindsorContainerFactory(IComponentExclusionSpecification criteriaToSatisfy) {
17            this.criteriaToSatisfy = criteriaToSatisfy;
18        }
19
20        public IWindsorContainer Create() {
21            if (null == container) {
22                container = new WindsorContainer();
23                container.Register(
24                    AllTypes
25                        .Pick()
26                        .FromAssembly(GetType().Assembly)
27                        .WithService
28                        .FirstInterface()
29                        .Unless(criteriaToSatisfy.IsSatisfiedBy)
30                        .Configure(
31                        delegate(ComponentRegistration registration) {
32                            this.LogInformational("{1}-{0}", registration.Implementation, registration.ServiceType.Name);
33                            if (registration.Implementation.GetInterfaces().Length == 0) {
34                                registration.For(registration.Implementation);
35                            }
36                        })
37                    );
38            }
39            return container;
40        }
41    }
42}