view Implab.ServiceHost/Unity/ConfigurationSchema.cs @ 272:9d1cca834b05 v3

preview version of Unity xml configuration
author cin
date Thu, 26 Apr 2018 03:14:54 +0300
parents d4d437ec4483
children
line wrap: on
line source

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>();
            schema.DefineMapping<IncludeElement>();
            schema.DefineMapping<AssemblyElement>();
            schema.DefineMapping<NamespaceElement>();

            return schema;
        }


    }
}