DefaultConfigurationStore
This implementation of  IConfigurationStore
              does not try to obtain an external configuration by any means.
              Its only purpose is to serve as a base class for subclasses
              that might obtain the configuration node from anywhere.
            
                using Castle.Core.Configuration;
using Castle.Core.Resource;
using Castle.MicroKernel.SubSystems.Resource;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Castle.MicroKernel.SubSystems.Configuration
{
    [Serializable]
    public class DefaultConfigurationStore : AbstractSubSystem, IConfigurationStore, ISubSystem
    {
        private readonly IDictionary<string, IConfiguration> childContainers = new Dictionary<string, IConfiguration>();
        private readonly IDictionary<string, IConfiguration> components = new Dictionary<string, IConfiguration>();
        private readonly IDictionary<string, IConfiguration> facilities = new Dictionary<string, IConfiguration>();
        private readonly ICollection<IConfiguration> installers = new List<IConfiguration>();
        private readonly object syncLock = new object();
        public void AddChildContainerConfiguration(string key, IConfiguration config)
        {
            lock (syncLock) {
                childContainers[key] = config;
            }
        }
        public void AddComponentConfiguration(string key, IConfiguration config)
        {
            lock (syncLock) {
                components[key] = config;
            }
        }
        public void AddFacilityConfiguration(string key, IConfiguration config)
        {
            lock (syncLock) {
                facilities[key] = config;
            }
        }
        public void AddInstallerConfiguration(IConfiguration config)
        {
            lock (syncLock) {
                installers.Add(config);
            }
        }
        public IConfiguration GetChildContainerConfiguration(string key)
        {
            lock (syncLock) {
                childContainers.TryGetValue(key, out IConfiguration value);
                return value;
            }
        }
        public IConfiguration GetComponentConfiguration(string key)
        {
            lock (syncLock) {
                components.TryGetValue(key, out IConfiguration value);
                return value;
            }
        }
        public IConfiguration[] GetComponents()
        {
            lock (syncLock) {
                return components.Values.ToArray();
            }
        }
        public IConfiguration[] GetConfigurationForChildContainers()
        {
            lock (syncLock) {
                return childContainers.Values.ToArray();
            }
        }
        public IConfiguration[] GetFacilities()
        {
            lock (syncLock) {
                return facilities.Values.ToArray();
            }
        }
        public IConfiguration GetFacilityConfiguration(string key)
        {
            lock (syncLock) {
                facilities.TryGetValue(key, out IConfiguration value);
                return value;
            }
        }
        public IConfiguration[] GetInstallers()
        {
            lock (syncLock) {
                return installers.ToArray();
            }
        }
        public IResource GetResource(string resourceUri, IResource resource)
        {
            string value = "://";
            if (resourceUri.IndexOf(value) == -1)
                return resource.CreateRelative(resourceUri);
            return ((IResourceSubSystem)base.Kernel.GetSubSystem(SubSystemConstants.ResourceKey)).CreateResource(resourceUri, resource.get_FileBasePath());
        }
        public override void Terminate()
        {
        }
    }
}