asp.net 自定义节配置 (configSections下的section)

<configuration>
  <configSections>
  <!--1.自定义一个节 CustomSection -->   
 <section name="CustomSection"
        type="CustomSection.BatchingHostingSettings, 
              CustomSection"/>
 <!--2.为CustomSection 这个节配置子节点-->   
  <CustomSection>
    <add type="CustomSection.FooService, CustomSection"/>
    <add type="CustomSection.BarService, CustomSection"/>
    <add type="CustomSection.BazService, CustomSection"/>
  </CustomSection>
</configuration>
3.定义转换器
   public class AssemblyQualifiedTypeNameConverter : ConfigurationConverterBase
    {
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            string typeName = (string)value;
            if (string.IsNullOrEmpty(typeName))
            {
                return null;
            }
            Type result = Type.GetType(typeName, false);
            if (result == null)
            {
                throw new ArgumentException(string.Format("不能加载类型\"{0}\"", typeName));
            }
            return result;
        }
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            Type type = value as Type;
            if (null == type)
            {
                throw new ArgumentNullException("value");
            }
            return type.AssemblyQualifiedName;
        }
    }
4.配置元素集合的元素类型的配置
 public class ServiceTypeElement : ConfigurationElement
    {
        [ConfigurationProperty("type", IsRequired = true)]
        [TypeConverter(typeof(AssemblyQualifiedTypeNameConverter))]
        public Type ServiceType
        {
            get { return (Type)this["type"]; }
            set { this["type"] = value; }
        }
    }
5.定义配置元素集合
    public class ServiceTypeElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceTypeElement();
        }
        protected override object GetElementKey(ConfigurationElement element)
        {
            ServiceTypeElement serviceTypeElement = (ServiceTypeElement)element;
            return serviceTypeElement.ServiceType.MetadataToken;
        }
    }
6.自定义节对应的类的定义
 public class BatchingHostingSettings : ConfigurationSection
    {
        [ConfigurationProperty("", IsDefaultCollection = true)]
        public ServiceTypeElementCollection ServiceTypes
        {
            get { return (ServiceTypeElementCollection)this[""]; }
        }

        public static BatchingHostingSettings GetSection()
        {
            return ConfigurationManager.GetSection("CustomSection")
                        as BatchingHostingSettings;
        }
    }
7. 对应要解析的类
 public class FooService
    {
    }
    public class BarService
    {
    }
    public class BazService
    {
    }
8.ServiceHostCollection
 public class ServiceHostCollection : Collection<ServiceHost>, IDisposable
    {

        public ServiceHostCollection(params Type[] serviceTypes)
        {

            BatchingHostingSettings settings = BatchingHostingSettings.GetSection();
            foreach (ServiceTypeElement element in settings.ServiceTypes)
            {
                this.Add(element.ServiceType);
            }

            if (null != serviceTypes)
            {
                Array.ForEach<Type>(serviceTypes, serviceType => this.Add(new ServiceHost(serviceType)));
            }
        }
        public void Add(params Type[] serviceTypes)
        {
            if (null != serviceTypes)
            {
                Array.ForEach<Type>(serviceTypes, serviceType => this.Add(new ServiceHost(serviceType)));
            }
        }
        public void Open()
        {
            foreach (ServiceHost host in this)
            {
                host.Open();
            }
        }
        public void Dispose()
        {
            foreach (IDisposable host in this)
            {
                host.Dispose();
            }
        }
    }
9.演示一个服务寄宿的例子
 protected void Page_Load(object sender, EventArgs e)
        {
            ServiceHostCollection list = new ServiceHostCollection();
            foreach (ServiceHost host in list)
            {
                host.Opened += (sender1, arg1) =>
                {
                 System.Diagnostics.Debug.WriteLine("服务{0}开始监听",
               (sender1 as ServiceHost).Description.ServiceType);
                };
            }
            list.Open();
            Console.Read();

        }

 

posted on 2017-03-23 09:42  听哥哥的话  阅读(374)  评论(0编辑  收藏  举报

导航