| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- //------------------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------------------------
- namespace System.ServiceModel.Configuration
- {
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Configuration;
- using System.Globalization;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- public sealed partial class CustomBindingCollectionElement : BindingCollectionElement
- {
- [ConfigurationProperty(ConfigurationStrings.DefaultCollectionName, Options = ConfigurationPropertyOptions.IsDefaultCollection)]
- public CustomBindingElementCollection Bindings
- {
- get { return (CustomBindingElementCollection)base[ConfigurationStrings.DefaultCollectionName]; }
- }
- public override Type BindingType
- {
- get { return typeof(CustomBinding); }
- }
- public override ReadOnlyCollection<IBindingConfigurationElement> ConfiguredBindings
- {
- get
- {
- List<IBindingConfigurationElement> configuredBindings = new List<IBindingConfigurationElement>();
- foreach (IBindingConfigurationElement configuredBinding in this.Bindings)
- {
- configuredBindings.Add(configuredBinding);
- }
- return new ReadOnlyCollection<IBindingConfigurationElement>(configuredBindings);
- }
- }
- public override bool ContainsKey(string name)
- {
- // This line needed because of the IBindingSection implementation
- return this.Bindings.ContainsKey(name);
- }
- protected internal override Binding GetDefault()
- {
- return System.Activator.CreateInstance<CustomBinding>();
- }
- internal static CustomBindingCollectionElement GetBindingCollectionElement()
- {
- return (CustomBindingCollectionElement)ConfigurationHelpers.GetBindingCollectionElement(ConfigurationStrings.CustomBindingCollectionElementName);
- }
- bool TryCreateMatchingExtension(BindingElement bindingElement, ExtensionElementCollection collection, bool allowDerivedTypes, string assemblyName, out BindingElementExtensionElement result)
- {
- result = null;
- foreach (ExtensionElement element in collection)
- {
- BindingElementExtensionElement bindingElementExtension = Activator.CreateInstance(Type.GetType(element.Type, true)) as BindingElementExtensionElement;
- if (null == bindingElementExtension)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ConfigurationErrorsException(SR.GetString(SR.ConfigInvalidExtensionType,
- element.Type,
- assemblyName,
- ConfigurationStrings.BindingElementExtensions)));
- }
- bool isMatch;
- if (allowDerivedTypes)
- {
- isMatch = bindingElementExtension.BindingElementType.IsAssignableFrom(bindingElement.GetType());
- }
- else
- {
- isMatch = bindingElementExtension.BindingElementType.Equals(bindingElement.GetType());
- }
- if (isMatch)
- {
- result = bindingElementExtension;
- return true;
- }
- }
- return false;
- }
- protected internal override bool TryAdd(string name, Binding binding, Configuration config)
- {
- if (String.IsNullOrEmpty(name))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("name");
- }
- if (null == binding)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("binding");
- }
- if (null == config)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("config");
- }
- ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(config);
- CustomBindingElementCollection customBindings = sg.Bindings.CustomBinding.Bindings;
- CustomBindingElement configElement = new CustomBindingElement(name);
- customBindings.Add(configElement);
- ExtensionElementCollection collection = sg.Extensions.BindingElementExtensions;
- CustomBinding customBinding = (CustomBinding)binding;
- foreach (BindingElement bindingElement in customBinding.Elements)
- {
- BindingElementExtensionElement bindingElementExtension;
- bool foundMatch = TryCreateMatchingExtension(bindingElement, collection, false, configElement.CollectionElementBaseType.AssemblyQualifiedName, out bindingElementExtension);
- if (!foundMatch)
- {
- foundMatch = TryCreateMatchingExtension(bindingElement, collection, true, configElement.CollectionElementBaseType.AssemblyQualifiedName, out bindingElementExtension);
- }
- if (!foundMatch)
- {
- break;
- }
- bindingElementExtension.InitializeFrom(bindingElement);
- configElement.Add(bindingElementExtension);
- }
- bool retval = configElement.Count == customBinding.Elements.Count;
- if (!retval)
- {
- customBindings.Remove(configElement);
- }
- return retval;
- }
- }
- }
|