Mercurial > pub > ImplabNet
comparison Implab.ServiceHost/Unity/ContainerConfigurationSchema.cs @ 273:79110a16cab7 v3
Working on Unity xml configuration: Refactoring in progress
| author | cin |
|---|---|
| date | Thu, 26 Apr 2018 19:35:01 +0300 |
| parents | |
| children | 22629bf26121 |
comparison
equal
deleted
inserted
replaced
| 272:9d1cca834b05 | 273:79110a16cab7 |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.IO; | |
| 4 using System.Reflection; | |
| 5 using System.Xml; | |
| 6 using System.Xml.Serialization; | |
| 7 using Implab.Components; | |
| 8 | |
| 9 namespace Implab.ServiceHost.Unity { | |
| 10 public class ContainerConfigurationSchema { | |
| 11 | |
| 12 public static ContainerConfigurationSchema Default { get; private set; } = CreateDefault(); | |
| 13 | |
| 14 readonly LazyAndWeak<XmlSerializer> m_seralizer; | |
| 15 | |
| 16 readonly XmlAttributeOverrides m_overrides = new XmlAttributeOverrides(); | |
| 17 | |
| 18 readonly XmlAttributes m_containerItems = new XmlAttributes(); | |
| 19 | |
| 20 public XmlSerializer Serializer { | |
| 21 get { | |
| 22 return m_seralizer.Value; | |
| 23 } | |
| 24 } | |
| 25 | |
| 26 public ContainerConfigurationSchema() { | |
| 27 m_overrides.Add(typeof(ContainerElement), nameof(ContainerElement.Items), m_containerItems); | |
| 28 | |
| 29 m_seralizer = new LazyAndWeak<XmlSerializer>(() => new XmlSerializer(typeof(ContainerElement), m_overrides)); | |
| 30 } | |
| 31 | |
| 32 public void RegisterContainerElement(Type type, string name) { | |
| 33 Safe.ArgumentNotNull(type, nameof(type)); | |
| 34 Safe.ArgumentNotEmpty(name, nameof(name)); | |
| 35 | |
| 36 if(!type.IsSubclassOf(typeof(ContainerItemElement))) | |
| 37 throw new Exception($"RegisterContainerElement '{name}': {type} must be subclass of {typeof(ContainerItemElement)}"); | |
| 38 | |
| 39 m_containerItems.XmlElements.Add( | |
| 40 new XmlElementAttribute(name, type) | |
| 41 ); | |
| 42 } | |
| 43 | |
| 44 public void RegisterContainerElement<T>(string name) where T : ContainerItemElement { | |
| 45 RegisterContainerElement(typeof(T), name); | |
| 46 } | |
| 47 | |
| 48 public ContainerElement LoadFile(string file) { | |
| 49 using (var reader = XmlReader.Create(file)) { | |
| 50 return (ContainerElement)Serializer.Deserialize(reader); | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 static ContainerConfigurationSchema CreateDefault() { | |
| 55 var schema = new ContainerConfigurationSchema(); | |
| 56 | |
| 57 schema.RegisterContainerElement<RegisterElement>("register"); | |
| 58 schema.RegisterContainerElement<IncludeElement>("include"); | |
| 59 schema.RegisterContainerElement<AssemblyElement>("assembly"); | |
| 60 schema.RegisterContainerElement<NamespaceElement>("namespace"); | |
| 61 | |
| 62 return schema; | |
| 63 } | |
| 64 | |
| 65 | |
| 66 } | |
| 67 } |
