We spent a lot of time before the last release looking for parts of the framework that either didn't work or were unnecessary to get the job done. An amazing amount of cruft can build up in a design over time. A great idea or new feature is often accompanied by several supporting pieces of infrastructure to make the feature work. When that feature is later changed or removed, those supporting pieces often mutate into some other purpose rather than going away. Cleaning out those extra bits now means that we won't have to support them for years to come.

Here are ten bits of the channel framework you may or may not have noticed disappeared in June.

  1. The InnerChannelListener property was removed from ChannelListenerBase. Use GetProperty instead to run queries on the channel stack at run time.
  2. The Identity property was removed from IChannelListener. Use GetProperty<EndpointIdentity> to access this instead.
  3. The MessageVersion property was removed from IChannelManager. Use GetProperty<MessageVersion> to access this instead.
  4. The Scheme property was removed from IChannelManager. There were a few implementations that needed this property, and those specific channels still have a Scheme property on their factory and listener.
  5. The Manager property of IChannel was removed. If you use the ChannelBase class, your implementation will still have a reference to the manager, but the property is now protected by default.
  6. We got rid of everything on the IChannelManager interface so we just pitched the whole thing. There's still a ChannelManagerBase class for you to extend but that's purely for convenience.
  7. The ChannelManagerBase class was slimmed down by removing the AbortChannels, CloseChannels, BeginCloseChannels, and EndCloseChannels methods. All of these methods were part of a channel lifecycle management system that clashed with our guidance for controlling channel resources. We've tried to not tie the lifetime of a channel up with the lifetime of its factory or listener.
  8. The EventSender property and constructor were removed from CommunicationObject. This was a very infrequently used feature that was causing problems for some channel implementations.
  9. The UnhandledBindingElements collection was removed from BindingContext. Add any information to the BindingParameters collection instead on the BindingContext and use Find or FindAll to search through the parameters later. This means there's only one place to search now instead of two.
  10. Each binding element had a BindingElementConverter class for importing and exporting policy. Some time ago we moved policy exporting to the binding elements but never removed anything from the converter classes. All of the BindingElementConverter classes are now named BindingElementImporter and just support policy import.

There's one last piece that wasn't technically removed but somewhat fits in with this list. The Fault member of CommunicationObject was changed from public to protected. It was totally inadvertent for anyone but the implementer to have access to this.

Next time: Consistency for Timeouts and Quotas