diff Implab.ServiceHost/Unity/ConfigurationSchema.cs @ 269:ff581cff7003 v3

Working on Unity container xml configuration
author cin
date Tue, 24 Apr 2018 01:46:02 +0300
parents
children d4d437ec4483
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Implab.ServiceHost/Unity/ConfigurationSchema.cs	Tue Apr 24 01:46:02 2018 +0300
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Xml;
+using System.Xml.Serialization;
+using Implab.Components;
+
+namespace Implab.ServiceHost.Unity {
+    public class ConfigurationSchema {
+
+        public static ConfigurationSchema Default { get; private set; } = CreateDefault();
+
+        readonly Dictionary<Tuple<string,string>, LazyAndWeak<XmlSerializer>> m_mappings = new Dictionary<Tuple<string, string>, LazyAndWeak<XmlSerializer>>();
+
+        public void DefineMapping(string name, string ns, Type type) {
+            Safe.ArgumentNotEmpty(name, nameof(name));
+            Safe.ArgumentNotNull(type, nameof(type));
+            ns = ns ?? string.Empty;
+            m_mappings[Tuple.Create(name, ns)] = new LazyAndWeak<XmlSerializer>(() => new XmlSerializer(type), true);
+        }
+
+        public void DefineMapping<T>() {
+            var xmlRoot = typeof(T).GetCustomAttribute<XmlRootAttribute>();
+            var ns = xmlRoot?.Namespace;
+            var root = xmlRoot?.ElementName ?? typeof(T).Name;
+            DefineMapping(root, ns, typeof(T));
+        }
+
+        public T Deserialize<T>(XmlReader reader) {
+            reader.MoveToContent();
+            var name = reader.Name;
+            var ns = reader.NamespaceURI;
+
+            return (T)m_mappings[Tuple.Create(name, ns)].Value.Deserialize(reader);
+        }
+
+        static ConfigurationSchema CreateDefault() {
+            var schema  = new ConfigurationSchema();
+
+            schema.DefineMapping<RegisterElement>();
+
+            return schema;
+        }
+
+
+    }
+}
\ No newline at end of file