summaryrefslogtreecommitdiff
path: root/src/Notepad/Infrastructure/Container/Windsor/IWindsorContainerFactory.cs
blob: 4087a5ef1de8247c26d9167ee5dd3d0a8c7b2d1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Notepad.Infrastructure.Extensions;

namespace Notepad.Infrastructure.Container.Windsor {
    public interface IWindsorContainerFactory {
        IWindsorContainer Create();
    }

    public class WindsorContainerFactory : IWindsorContainerFactory {
        private static IWindsorContainer container;
        private IComponentExclusionSpecification criteriaToSatisfy;

        public WindsorContainerFactory() : this(new ComponentExclusionSpecification()) {}

        public WindsorContainerFactory(IComponentExclusionSpecification criteriaToSatisfy) {
            this.criteriaToSatisfy = criteriaToSatisfy;
        }

        public IWindsorContainer Create() {
            if (null == container) {
                container = new WindsorContainer();
                container.Register(
                    AllTypes
                        .Pick()
                        .FromAssembly(GetType().Assembly)
                        .WithService
                        .FirstInterface()
                        .Unless(criteriaToSatisfy.IsSatisfiedBy)
                        .Configure(
                        delegate(ComponentRegistration registration) {
                            this.LogInformational("{1}-{0}", registration.Implementation, registration.ServiceType.Name);
                            if (registration.Implementation.GetInterfaces().Length == 0) {
                                registration.For(registration.Implementation);
                            }
                        })
                    );
            }
            return container;
        }
    }
}