public static ProcessingUnitHost FromConfiguration(MessagePipelineSection configuration)
        {
            ProcessingUnitHost host = new ProcessingUnitHost();
            Dictionary<string,IChannel> mChannelLookup = new Dictionary<string,IChannel>();
            for (int i = 0; i < configuration.Pipelines.Count; i++)
            {
                for (int j = 0; j < configuration.Pipelines[i].Channels.Count; j++)
                {
                    var channel = configuration.Pipelines[i].Channels[j];
                    if (channel.Scheme != "sb")
                        throw new NotImplementedException("Schemes other than 'sb' are not supported.");
                    //TODO: this is not nice... other/better way to do injection (support custom implementation)
                    mChannelLookup.Add(channel.Name, (IChannel)Activator.CreateInstance
                    (Type.GetType("IntegrationPatterns.ServiceBus.Channel, IntegrationPatterns.ServiceBus"),
                     channel.Name));

                }
                for (int j = 0; j < configuration.Pipelines[i].ProcessingUnits.Count; j++)
                {
                    var config = configuration.Pipelines[i].ProcessingUnits[j];
                    var unit = Activator.CreateInstance(Type.GetType(config.UnitType));
                    fixChannelReferences(((ProcessingUnit)unit).InputChannels, config.Inputs, mChannelLookup);
                    fixChannelReferences(((ProcessingUnit)unit).OutputChannels, config.Outputs, mChannelLookup);
                    fixChannelReferences(((ProcessingUnit)unit).ControlChannels, config.Controls, mChannelLookup);
                    host.AddProcessingUnit(config.Name, (ProcessingUnit)unit);
                }
            }
            return host;
        }