DefaultResourceSubSystem
Pendent
            
                using Castle.Core.Resource;
using System;
using System.Collections.Generic;
namespace Castle.MicroKernel.SubSystems.Resource
{
    public class DefaultResourceSubSystem : AbstractSubSystem, IResourceSubSystem, ISubSystem
    {
        private readonly List<IResourceFactory> resourceFactories = new List<IResourceFactory>();
        public DefaultResourceSubSystem()
        {
            InitDefaultResourceFactories();
        }
        public IResource CreateResource(string resource)
        {
            if (resource == null)
                throw new ArgumentNullException("resource");
            return CreateResource(new CustomUri(resource));
        }
        public IResource CreateResource(string resource, string basePath)
        {
            if (resource == null)
                throw new ArgumentNullException("resource");
            return CreateResource(new CustomUri(resource), basePath);
        }
        public IResource CreateResource(CustomUri uri)
        {
            if (uri == null)
                throw new ArgumentNullException("uri");
            foreach (IResourceFactory resourceFactory in resourceFactories) {
                if (resourceFactory.Accept(uri))
                    return resourceFactory.Create(uri);
            }
            throw new KernelException("No Resource factory was able to deal with Uri " + ((object)uri)?.ToString());
        }
        public IResource CreateResource(CustomUri uri, string basePath)
        {
            if (uri == null)
                throw new ArgumentNullException("uri");
            if (basePath == null)
                throw new ArgumentNullException("basePath");
            foreach (IResourceFactory resourceFactory in resourceFactories) {
                if (resourceFactory.Accept(uri))
                    return resourceFactory.Create(uri, basePath);
            }
            throw new KernelException("No Resource factory was able to deal with Uri " + ((object)uri)?.ToString());
        }
        public void RegisterResourceFactory(IResourceFactory resourceFactory)
        {
            if (resourceFactory == null)
                throw new ArgumentNullException("resourceFactory");
            resourceFactories.Add(resourceFactory);
        }
        protected virtual void InitDefaultResourceFactories()
        {
            RegisterResourceFactory(new AssemblyResourceFactory());
            RegisterResourceFactory(new UncResourceFactory());
            RegisterResourceFactory(new FileResourceFactory());
        }
    }
}