Mercurial > pub > ImplabNet
comparison Implab.ServiceHost/Unity/ContainerBuilder.cs @ 274:22629bf26121 v3
Unity xml configuration, alpha2
| author | cin |
|---|---|
| date | Fri, 27 Apr 2018 04:47:52 +0300 |
| parents | |
| children | 963b17c275be |
comparison
equal
deleted
inserted
replaced
| 273:79110a16cab7 | 274:22629bf26121 |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Text.RegularExpressions; | |
| 4 using Implab.Diagnostics; | |
| 5 | |
| 6 namespace Implab.ServiceHost.Unity { | |
| 7 using System.Linq; | |
| 8 using System.Reflection; | |
| 9 using System.Text; | |
| 10 using global::Unity; | |
| 11 using global::Unity.Registration; | |
| 12 using Implab.Xml; | |
| 13 using static Trace<ContainerBuilder>; | |
| 14 | |
| 15 public class ContainerBuilder { | |
| 16 | |
| 17 readonly TypeResolver m_resolver; | |
| 18 | |
| 19 readonly UnityContainer m_container; | |
| 20 | |
| 21 readonly ContainerConfigurationSchema m_schema; | |
| 22 | |
| 23 public UnityContainer Container { | |
| 24 get { | |
| 25 return m_container; | |
| 26 } | |
| 27 } | |
| 28 | |
| 29 public ContainerBuilder() : this(null, null) { | |
| 30 } | |
| 31 | |
| 32 public ContainerBuilder(UnityContainer container, ContainerConfigurationSchema schema) { | |
| 33 m_container = container ?? new UnityContainer(); | |
| 34 m_resolver = new TypeResolver(); | |
| 35 m_schema = schema ?? ContainerConfigurationSchema.Default; | |
| 36 } | |
| 37 | |
| 38 public Type ResolveType(string typeReference) { | |
| 39 return m_resolver.Resolve(typeReference); | |
| 40 } | |
| 41 | |
| 42 internal void Visit(RegisterElement registerElement) { | |
| 43 var registrationType = ResolveType(registerElement.RegistrationType); | |
| 44 var implementationType = string.IsNullOrEmpty(registerElement.MapToType) ? registrationType : ResolveType(registerElement.MapToType); | |
| 45 | |
| 46 var registrationContext = new TypeRegistrationBuilder( | |
| 47 m_resolver, | |
| 48 registrationType, | |
| 49 implementationType | |
| 50 ); | |
| 51 | |
| 52 if (registerElement.Injectors != null) { | |
| 53 foreach (var injector in registerElement.Injectors) { | |
| 54 injector.Visit(registrationContext); | |
| 55 } | |
| 56 } | |
| 57 | |
| 58 m_container.RegisterType( | |
| 59 registrationContext.RegistrationType, | |
| 60 registrationContext.ImplementationType, | |
| 61 registerElement.Name, | |
| 62 registerElement.Lifetime?.GetLifetimeManager(this), | |
| 63 registrationContext.Injections | |
| 64 ); | |
| 65 } | |
| 66 | |
| 67 internal void Visit(SerializedElement serializedElement) { | |
| 68 var registrationType = ResolveType(serializedElement.RegistrationType); | |
| 69 var valueBuilder = new InjectionValueBuilder(m_resolver, null); | |
| 70 | |
| 71 valueBuilder.Visit(serializedElement); | |
| 72 | |
| 73 m_container.RegisterInstance( | |
| 74 registrationType, | |
| 75 serializedElement.Name, | |
| 76 valueBuilder.Value, | |
| 77 serializedElement.Lifetime?.GetLifetimeManager(this) | |
| 78 ); | |
| 79 } | |
| 80 | |
| 81 internal void Visit(ValueElement valueElement) { | |
| 82 var registrationType = ResolveType(valueElement.RegistrationType); | |
| 83 var valueBuilder = new InjectionValueBuilder(m_resolver, null); | |
| 84 | |
| 85 valueBuilder.Visit(valueElement); | |
| 86 | |
| 87 m_container.RegisterInstance( | |
| 88 registrationType, | |
| 89 valueElement.Name, | |
| 90 valueBuilder.Value, | |
| 91 valueElement.Lifetime?.GetLifetimeManager(this) | |
| 92 ); | |
| 93 } | |
| 94 | |
| 95 internal void Visit(NamespaceElement namespaceElement) { | |
| 96 m_resolver.AddNamespace(namespaceElement.Name); | |
| 97 } | |
| 98 | |
| 99 internal void Visit(AssemblyElement assemblyElement) { | |
| 100 Assembly.Load(assemblyElement.AssemblyName); | |
| 101 } | |
| 102 | |
| 103 internal void Visit(IncludeElement includeElement) { | |
| 104 Include(includeElement.Href); | |
| 105 } | |
| 106 | |
| 107 public void Include(string file) { | |
| 108 var includeContext = new ContainerBuilder(m_container, m_schema); | |
| 109 includeContext.LoadConfig(file); | |
| 110 } | |
| 111 | |
| 112 public void LoadConfig(string file) { | |
| 113 var config = m_schema.LoadFile(file); | |
| 114 Visit(config); | |
| 115 } | |
| 116 | |
| 117 internal void Visit(ContainerElement containerElement) { | |
| 118 foreach (var item in containerElement.Items) | |
| 119 item.Visit(this); | |
| 120 } | |
| 121 | |
| 122 | |
| 123 | |
| 124 } | |
| 125 } |
