public static FluentConfigurationSource UseTopShelf(this FluentConfigurationSource builder, Action<ConfigurationSettings> settingsFactory)
        {
            var settings = new ConfigurationSettings();
            settingsFactory(settings);

            return builder.UsingServiceHost<TopShelfHost>(context =>
            {
                context.SetDescription(settings.Description);
                context.SetDisplayName(settings.DisplayName);
                context.SetPassword(settings.Password);
                context.SetServiceName(settings.ServiceName);
                context.SetUsername(settings.Username);
                context.SetUserType(settings.UserType);
            });
        }
        private IConfigurationContext MergeConfiguration(IConfigurationContext configuration)
        {
            var defaultSettings = new Configuration.ConfigurationSettings();
            var configSection   = ConfigurationHelper.GetConfigSection <Configuration.ConfigurationSection>();

            if (configSection != null)
            {
                if (!String.IsNullOrWhiteSpace(configSection.RunAs.UserType))
                {
                    switch (configSection.RunAs.UserType.ToUpper())
                    {
                    case "LOCALSERVICE":
                        configuration.SetUserType(Configuration.RunAs.LocalService);
                        break;

                    case "LOCALSYSTEM":
                        configuration.SetUserType(Configuration.RunAs.LocalSystem);
                        break;

                    case "NETWORKSERVICE":
                        configuration.SetUserType(Configuration.RunAs.NetworkService);
                        break;

                    case "USER":
                        configuration.SetUserType(Configuration.RunAs.User);
                        break;
                    }

                    if (!String.IsNullOrWhiteSpace(configSection.RunAs.Username))
                    {
                        configuration.SetUsername(configSection.RunAs.Username);
                    }

                    if (!String.IsNullOrWhiteSpace(configSection.RunAs.Password))
                    {
                        configuration.SetPassword(configSection.RunAs.Password);
                    }
                }

                if (!String.IsNullOrWhiteSpace(configSection.Service.Description))
                {
                    configuration.SetDescription(configSection.Service.Description);
                }

                if (!String.IsNullOrWhiteSpace(configSection.Service.DisplayName))
                {
                    configuration.SetDisplayName(configSection.Service.DisplayName);
                }

                if (!String.IsNullOrWhiteSpace(configSection.Service.Name))
                {
                    configuration.SetServiceName(configSection.Service.Name);
                }
            }

            // Set Defaults
            if (String.IsNullOrWhiteSpace(configuration.GetServiceName()))
            {
                configuration.SetServiceName(configuration.AssemblyLocator.GetEntryAssembly().GetName().Name);
            }

            if (String.IsNullOrWhiteSpace(configuration.GetDescription()))
            {
                configuration.SetDescription("Wave Service Host");
            }

            if (String.IsNullOrWhiteSpace(configuration.GetDisplayName()))
            {
                configuration.SetDisplayName(configuration.AssemblyLocator.GetEntryAssembly().GetName().Name);
            }

            return(configuration);
        }