Mercurial > pub > ImplabNet
comparison Implab.ServiceHost/Unity/ContainerBuilder.cs @ 279:8714471e8d78 v3
Container configuration cleanup, RC2
| author | cin |
|---|---|
| date | Fri, 04 May 2018 18:12:42 +0300 |
| parents | 6691aff01de1 |
| children | f07be402ab02 |
comparison
equal
deleted
inserted
replaced
| 278:6691aff01de1 | 279:8714471e8d78 |
|---|---|
| 5 namespace Implab.ServiceHost.Unity { | 5 namespace Implab.ServiceHost.Unity { |
| 6 public class ContainerBuilder { | 6 public class ContainerBuilder { |
| 7 | 7 |
| 8 readonly TypeResolver m_resolver; | 8 readonly TypeResolver m_resolver; |
| 9 | 9 |
| 10 readonly UnityContainer m_container; | 10 readonly IUnityContainer m_container; |
| 11 | 11 |
| 12 readonly ContainerConfigurationSchema m_schema; | 12 readonly ContainerConfigurationSchema m_schema; |
| 13 | 13 |
| 14 public UnityContainer Container { | 14 public IUnityContainer Container { |
| 15 get { | 15 get { |
| 16 return m_container; | 16 return m_container; |
| 17 } | 17 } |
| 18 } | 18 } |
| 19 | 19 |
| 20 public ContainerBuilder() : this(null, null) { | 20 public ContainerBuilder() : this(null, null) { |
| 21 } | 21 } |
| 22 | 22 |
| 23 public ContainerBuilder(UnityContainer container, ContainerConfigurationSchema schema) { | 23 public ContainerBuilder(IUnityContainer container, ContainerConfigurationSchema schema) { |
| 24 m_container = container ?? new UnityContainer(); | 24 m_container = container ?? new UnityContainer(); |
| 25 m_resolver = new TypeResolver(); | 25 m_resolver = new TypeResolver(); |
| 26 m_schema = schema ?? ContainerConfigurationSchema.Default; | 26 m_schema = schema ?? ContainerConfigurationSchema.Default; |
| 27 } | 27 } |
| 28 | 28 |
| 29 public Type ResolveType(string typeReference) { | 29 public Type ResolveType(string typeReference) { |
| 30 return m_resolver.Resolve(typeReference, true); | 30 return string.IsNullOrEmpty(typeReference) ? null : m_resolver.Resolve(typeReference, true); |
| 31 } | |
| 32 | |
| 33 | |
| 34 internal void Visit(TypeAbstractRegistration typeRegistration) { | |
| 35 var registrationType = typeRegistration.GetRegistrationType(ResolveType); | |
| 36 var implementationType = typeRegistration.GetImplementationType(ResolveType) ?? registrationType; | |
| 37 | |
| 38 var registrationContext = new TypeRegistrationBuilder( | |
| 39 m_resolver, | |
| 40 registrationType, | |
| 41 implementationType | |
| 42 ); | |
| 43 | |
| 44 typeRegistration.Visit(registrationContext); | |
| 45 | |
| 46 m_container.RegisterType( | |
| 47 registrationContext.RegistrationType, | |
| 48 registrationContext.ImplementationType, | |
| 49 typeRegistration.Name, | |
| 50 registrationContext.Lifetime, | |
| 51 registrationContext.Injections | |
| 52 ); | |
| 53 } | |
| 54 | |
| 55 internal void Visit(InstanceAbstractRegistration instanceRegistration) { | |
| 56 var registrationType = instanceRegistration.GetRegistrationType(ResolveType); | |
| 57 | |
| 58 var builder = new InstanceRegistrationBuilder(m_resolver, registrationType); | |
| 59 | |
| 60 instanceRegistration.Visit(builder); | |
| 61 | |
| 62 m_container.RegisterInstance( | |
| 63 builder.ValueBuilder.ValueType, | |
| 64 instanceRegistration.Name, | |
| 65 builder.ValueBuilder.Value, | |
| 66 builder.Lifetime | |
| 67 ); | |
| 68 } | |
| 69 | |
| 70 internal void Visit(FactoryAbstractRegistratrion factoryRgistration) { | |
| 71 var registrationType = factoryRgistration.GetRegistrationType(ResolveType); | |
| 72 | |
| 73 var builder = new FactoryRegistrationBuilder(registrationType); | |
| 74 | |
| 75 factoryRgistration.Visit(builder); | |
| 76 | |
| 77 m_container.RegisterType( | |
| 78 builder.RegistrationType, | |
| 79 factoryRgistration.Name, | |
| 80 builder.Lifetime, | |
| 81 builder.Factory | |
| 82 ); | |
| 83 } | 31 } |
| 84 | 32 |
| 85 public void Visit(ITypeRegistration registration) { | 33 public void Visit(ITypeRegistration registration) { |
| 86 Safe.ArgumentNotNull(registration, nameof(registration)); | 34 Safe.ArgumentNotNull(registration, nameof(registration)); |
| 87 | 35 |
| 134 throw new Exception($"A type must be specified for the registration {registration.Name}"); | 82 throw new Exception($"A type must be specified for the registration {registration.Name}"); |
| 135 | 83 |
| 136 m_container.RegisterInstance( | 84 m_container.RegisterInstance( |
| 137 builder.RegistrationType ?? builder.ValueBuilder.ValueType, | 85 builder.RegistrationType ?? builder.ValueBuilder.ValueType, |
| 138 registration.Name, | 86 registration.Name, |
| 139 builder.ValueBuilder.Injection, | 87 builder.ValueBuilder.Value, |
| 140 builder.Lifetime | 88 builder.Lifetime |
| 141 ); | 89 ); |
| 142 } | |
| 143 | |
| 144 public void Visit(IFactoryRegistration registration) { | |
| 145 Safe.ArgumentNotNull(registration, nameof(registration)); | |
| 146 | |
| 147 var registrationType = registration.GetRegistrationType(this); | |
| 148 | |
| 149 var builder = new FactoryRegistrationBuilder(registrationType); | |
| 150 | |
| 151 if (registration.MemberInjections != null) { | |
| 152 foreach(var member in registration.MemberInjections) | |
| 153 member?.Visit(builder); | |
| 154 } | |
| 155 | |
| 156 } | 90 } |
| 157 | 91 |
| 158 public void AddNamespace(string ns) { | 92 public void AddNamespace(string ns) { |
| 159 m_resolver.AddNamespace(ns); | 93 m_resolver.AddNamespace(ns); |
| 160 } | 94 } |
