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 , 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 (serviceTypes, serviceType => this.Add(new ServiceHost(serviceType))); } } public void Add(params Type[] serviceTypes) { if (null != serviceTypes) { Array.ForEach (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(); }