Mercurial > pub > ImplabNet
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