Skip to content

Commit

Permalink
Fixing some issues with the AggregateSettingsProvider
Browse files Browse the repository at this point in the history
The settings provider didn't work if one of the providers returned null for a setting, but the return type wasn't nullable. To sort this I've added a new method to the `ISettingsProvider` interface to return the unconverted string value, which allows the aggregate provider to get the value and do the conversion separately.
  • Loading branch information
adamconnelly committed Nov 22, 2017
1 parent 206f193 commit bafe058
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 26 deletions.
8 changes: 2 additions & 6 deletions AppConfigFacility.Azure/AzureSettingsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,8 @@
/// </summary>
public class AzureSettingsProvider : SettingsProviderBase
{
/// <summary>
/// Gets the setting as a string from some config source.
/// </summary>
/// <param name="key">The key of the setting.</param>
/// <returns>The string value of the setting.</returns>
protected override string GetSetting(string key)
/// <inheritdoc />
public override string GetSetting(string key)
{
return CloudConfigurationManager.GetSetting(key);
}
Expand Down
11 changes: 8 additions & 3 deletions AppConfigFacility/AggregateSettingsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace AppConfigFacility
/// A wrapper around several <see cref="ISettingsProvider"/> objects that will attempt to get
/// settings from each one in turn.
/// </summary>
public class AggregateSettingsProvider : ISettingsProvider
public class AggregateSettingsProvider : SettingsProviderBase
{
private readonly IReadOnlyCollection<ISettingsProvider> _settingsProviders;

Expand All @@ -34,11 +34,16 @@ public AggregateSettingsProvider(IReadOnlyCollection<ISettingsProvider> settings
/// </summary>
public IReadOnlyCollection<ISettingsProvider> SettingsProviders => _settingsProviders;

public object GetSetting(string key, Type returnType)
public override object GetSetting(string key, Type returnType)
{
return ConvertSetting(GetSetting(key), returnType);
}

public override string GetSetting(string key)
{
foreach (var provider in _settingsProviders)
{
var value = provider.GetSetting(key, returnType);
var value = provider.GetSetting(key);
if (value != null)
{
return value;
Expand Down
8 changes: 2 additions & 6 deletions AppConfigFacility/AppSettingsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,8 @@
/// </summary>
public class AppSettingsProvider : SettingsProviderBase
{
/// <summary>
/// Gets the setting as a string from some config source.
/// </summary>
/// <param name="key">The key of the setting.</param>
/// <returns>The string value of the setting.</returns>
protected override string GetSetting(string key)
/// <inheritdoc />
public override string GetSetting(string key)
{
return ConfigurationManager.AppSettings[key];
}
Expand Down
3 changes: 2 additions & 1 deletion AppConfigFacility/EnvironmentSettingsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ namespace AppConfigFacility
/// </summary>
public class EnvironmentSettingsProvider : SettingsProviderBase
{
protected override string GetSetting(string key)
/// <inheritdoc />
public override string GetSetting(string key)
{
return Environment.GetEnvironmentVariable(key);
}
Expand Down
7 changes: 7 additions & 0 deletions AppConfigFacility/ISettingsProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,12 @@ public interface ISettingsProvider
/// The setting.
/// </returns>
object GetSetting(string key, Type returnType);

/// <summary>
/// Gets the setting as a string from some config source.
/// </summary>
/// <param name="key">The key of the setting.</param>
/// <returns>The string value of the setting.</returns>
string GetSetting(string key);
}
}
27 changes: 17 additions & 10 deletions AppConfigFacility/SettingsProviderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,35 +8,42 @@ namespace AppConfigFacility
public abstract class SettingsProviderBase : ISettingsProvider
{
/// <summary>
/// Gets the specified setting.
/// Gets the specified setting and converts it to the specified type.
/// </summary>
/// <param name="key">The setting key.</param>
/// <param name="returnType">The type of the setting.</param>
/// <returns>
/// The setting.
/// </returns>
public object GetSetting(string key, Type returnType)
public virtual object GetSetting(string key, Type returnType)
{
var value = GetSetting(key);

return ConvertSetting(value, returnType);
}

/// <inheritdoc />
public abstract string GetSetting(string key);

/// <summary>
/// Converts the specified value into the specified type.
/// </summary>
/// <param name="value">The string representation.</param>
/// <param name="returnType">The return type.</param>
/// <returns>The value converted to the specified type.</returns>
protected object ConvertSetting(string value, Type returnType)
{
if (returnType.IsEnum)
{
return Enum.Parse(returnType, value);
}

if (returnType == typeof(Uri))
{
return new Uri(value);
}

return Convert.ChangeType(value, returnType);
}

/// <summary>
/// Gets the setting as a string from some config source.
/// </summary>
/// <param name="key">The key of the setting.</param>
/// <returns>The string value of the setting.</returns>
protected abstract string GetSetting(string key);
}
}

0 comments on commit bafe058

Please sign in to comment.