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}