/// <summary>
        /// Find the object to pass the method call through to.
        /// </summary>
        /// <typeparam name="T">Type implementing method.</typeparam>
        /// <param name="query">Query string in URI format.</param>
        /// <param name="wcfserviceParams">WCF service connection parameters.</param>
        /// <param name="services">Object registry.</param>
        /// <param name="createService1">Function to create Dbus Service taking service connection parameters.</param>
        /// <param name="createService2">Function to create Dbus Service taking service connection parameters and Dbus connection parameters.</param>
        /// <param name="defaultConnectionParameters">Default Dbus connection parameters for Dbus Service.</param>
        /// <returns>Object implementing method.</returns>
        static public T GetWCFMethodTarget <T>(string query
                                               , Udbus.WCF.Host.WCFServiceParams wcfserviceParams
                                               , System.Collections.Generic.IDictionary <DbusServiceKey, T> services
                                               , System.Func <Udbus.Core.ServiceConnectionParams, T> createService1
                                               , System.Func <Udbus.Core.ServiceConnectionParams, Udbus.Serialization.DbusConnectionParameters, T> createService2
                                               , Udbus.Serialization.ReadonlyDbusConnectionParameters defaultConnectionParameters)
        {
            // Look for query parameters.
            string busnameValue;
            string pathValue;

            GetDbusParametersFromQuery(query, out busnameValue, out pathValue);

            // Lookup existing service.
            DbusServiceKey find = new DbusServiceKey(busnameValue, pathValue);
            T result;

            if (services.TryGetValue(find, out result) == false) // If object not in registry
            {
                result = CreateDbusService(wcfserviceParams, createService1, createService2, defaultConnectionParameters, busnameValue, pathValue);

                // Store new service for future generations.
                services[find] = result;
            } // Ends if object not in registry

            return(result);
        }
 /// <summary>
 /// Create a Dbus Service based on the supplied parameters.
 /// </summary>
 /// <typeparam name="T">Dbus Service type.</typeparam>
 /// <param name="wcfserviceParams">WCF service connection parameters.</param>
 /// <param name="createService1">Function to create Dbus Service taking service connection parameters.</param>
 /// <param name="createService2">Function to create Dbus Service taking service connection parameters and Dbus connection parameters.</param>
 /// <param name="defaultConnectionParameters">Default Dbus connection parameters for Dbus Service.</param>
 /// <returns>new Dbus Service instance.</returns>
 public static T CreateDbusService <T>(Udbus.WCF.Host.WCFServiceParams wcfserviceParams
                                       , System.Func <Udbus.Core.ServiceConnectionParams, T> createService1
                                       , System.Func <Udbus.Core.ServiceConnectionParams, Udbus.Serialization.DbusConnectionParameters, T> createService2
                                       , Udbus.Serialization.ReadonlyDbusConnectionParameters defaultConnectionParameters)
 {
     return(CreateDbusService(System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.To.Query,
                              wcfserviceParams, createService1, createService2, defaultConnectionParameters));
 }
 /// <summary>
 /// Find the object to pass the method call through to, using query information embedded in current WCF method invocation.
 /// </summary>
 /// <typeparam name="T">Type implementing method.</typeparam>
 /// <param name="wcfserviceParams">WCF service connection parameters.</param>
 /// <param name="services">Object registry.</param>
 /// <param name="createService1">Function to create Dbus Service taking service connection parameters.</param>
 /// <param name="createService2">Function to create Dbus Service taking service connection parameters and Dbus connection parameters.</param>
 /// <param name="defaultConnectionParameters">Default Dbus connection parameters for Dbus Service.</param>
 /// <returns>Object implementing method.</returns>
 static public T GetWCFMethodTarget <T>(Udbus.WCF.Host.WCFServiceParams wcfserviceParams
                                        , System.Collections.Generic.IDictionary <DbusServiceKey, T> services
                                        , System.Func <Udbus.Core.ServiceConnectionParams, T> createService1
                                        , System.Func <Udbus.Core.ServiceConnectionParams, Udbus.Serialization.DbusConnectionParameters, T> createService2
                                        , Udbus.Serialization.ReadonlyDbusConnectionParameters defaultConnectionParameters)
 {
     return(GetWCFMethodTarget(System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.To.Query,
                               wcfserviceParams, services, createService1, createService2, defaultConnectionParameters));
 }
        /// <summary>
        /// Create a Dbus Service based on the supplied parameters.
        /// </summary>
        /// <typeparam name="T">Dbus Service type.</typeparam>
        /// <param name="query">Query string in URI format.</param>
        /// <param name="wcfserviceParams">WCF service connection parameters.</param>
        /// <param name="createService1">Function to create Dbus Service taking service connection parameters.</param>
        /// <param name="createService2">Function to create Dbus Service taking service connection parameters and Dbus connection parameters.</param>
        /// <param name="defaultConnectionParameters">Default Dbus connection parameters for Dbus Service.</param>
        /// <returns>new Dbus Service instance.</returns>
        public static T CreateDbusService <T>(string query
                                              , Udbus.WCF.Host.WCFServiceParams wcfserviceParams
                                              , System.Func <Udbus.Core.ServiceConnectionParams, T> createService1
                                              , System.Func <Udbus.Core.ServiceConnectionParams, Udbus.Serialization.DbusConnectionParameters, T> createService2
                                              , Udbus.Serialization.ReadonlyDbusConnectionParameters defaultConnectionParameters)
        {
            string busname;
            string path;

            GetDbusParametersFromQuery(query, out busname, out path);
            return(CreateDbusService(wcfserviceParams, createService1, createService2, defaultConnectionParameters, busname, path));
        }
        /// <summary>
        /// Create a Dbus Service based on the supplied parameters.
        /// </summary>
        /// <typeparam name="T">Dbus Service type.</typeparam>
        /// <param name="wcfserviceParams">WCF service connection parameters.</param>
        /// <param name="createService1">Function to create Dbus Service taking service connection parameters.</param>
        /// <param name="createService2">Function to create Dbus Service taking service connection parameters and Dbus connection parameters.</param>
        /// <param name="defaultConnectionParameters">Default Dbus connection parameters for Dbus Service.</param>
        /// <param name="busname">Dbus bus name for Dbus Service.</param>
        /// <param name="path">Dbus path for Dbus Service.</param>
        /// <returns>new Dbus Service instance.</returns>
        public static T CreateDbusService <T>(Udbus.WCF.Host.WCFServiceParams wcfserviceParams
                                              , System.Func <Udbus.Core.ServiceConnectionParams, T> createService1
                                              , System.Func <Udbus.Core.ServiceConnectionParams, Udbus.Serialization.DbusConnectionParameters, T> createService2
                                              , Udbus.Serialization.ReadonlyDbusConnectionParameters defaultConnectionParameters
                                              , string busname, string path)
        {
            T result;

            if (string.IsNullOrEmpty(busname) && string.IsNullOrEmpty(path)) // If no parameters provided
            {
                if (wcfserviceParams.DbusConnectionParameters.HasValue)      // If WCF Service was initialised with some settings
                {
                    // Create Dbus Service with WCF service's dbus connect settings.
                    result = createService2(wcfserviceParams.ServiceConnectionParams, wcfserviceParams.DbusConnectionParameters.Value);
                }    // Ends if WCF Service was initialised with some settings
                else // Else WCF Service was not initialised with some settings
                {
                    // Create Dbus Service with default dbus connect settings.
                    result = createService1(wcfserviceParams.ServiceConnectionParams);
                } // Ends else WCF Service was not initialised with some settings
            }     // Ends if no parameters provided
            else  // Else parameters provided
            {
                Udbus.Serialization.DbusConnectionParameters connectionParameters;
                if (wcfserviceParams.DbusConnectionParameters.HasValue) // If WCF Service was initialised with some settings
                {
                    // Use WCF service's dbus connect settings as starting point.
                    connectionParameters = wcfserviceParams.DbusConnectionParameters.Value;
                }    // Ends if WCF Service was initialised with some settings
                else // Else WCF Service was not initialised with some settings
                {
                    // Use default dbus connect settings as starting point.
                    connectionParameters = defaultConnectionParameters;
                } // Ends else WCF Service was not initialised with some settings

                if (!string.IsNullOrEmpty(busname)) // If busname supplied
                {
                    connectionParameters.Destination = busname;
                } // Ends if busname supplied

                if (!string.IsNullOrEmpty(path)) // If path supplied
                {
                    connectionParameters.Path = path;
                } // Ends if path supplied

                result = createService2(wcfserviceParams.ServiceConnectionParams, connectionParameters);
            } // Ends else parameters provided

            return(result);
        }