Skip to content

Commit

Permalink
SettingsService follows OpenClosed Principle: Now it is possible to p…
Browse files Browse the repository at this point in the history
…rovide own implementations of ISettingSerializer
  • Loading branch information
marcwittke committed Dec 13, 2017
1 parent 45b268b commit 70dfb4b
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ namespace Backend.Fx.ConfigurationSettings

public class SettingSerializerFactory
{
private readonly Dictionary<Type, ISettingSerializer> serializers;
protected Dictionary<Type, ISettingSerializer> Serializers { get; }

public SettingSerializerFactory()
{
serializers = typeof(ISettingSerializer)
Serializers = typeof(ISettingSerializer)
.GetTypeInfo()
.Assembly
.ExportedTypes
Expand All @@ -28,9 +28,9 @@ public SettingSerializerFactory()
[NotNull]
public ISettingSerializer<T> GetSerializer<T>()
{
if (serializers.ContainsKey(typeof(T)))
if (Serializers.ContainsKey(typeof(T)))
{
return (ISettingSerializer<T>) serializers[typeof(T)];
return (ISettingSerializer<T>) Serializers[typeof(T)];
}

throw new ArgumentOutOfRangeException(nameof(T), string.Format("No Serializer for Setting Type {0} available", typeof(T).Name));
Expand Down
9 changes: 5 additions & 4 deletions src/Backend.Fx/ConfigurationSettings/SettingsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ public abstract class SettingsService
{
private readonly IEntityIdGenerator idGenerator;
private readonly IRepository<Setting> settingRepository;
private static readonly SettingSerializerFactory SettingSerializerFactory = new SettingSerializerFactory();
private readonly SettingSerializerFactory settingSerializerFactory;

protected SettingsService(IEntityIdGenerator idGenerator, IRepository<Setting> settingRepository)
protected SettingsService(IEntityIdGenerator idGenerator, IRepository<Setting> settingRepository, SettingSerializerFactory settingSerializerFactory)
{
this.idGenerator = idGenerator;
this.settingRepository = settingRepository;
this.settingSerializerFactory = settingSerializerFactory;
}

protected T ReadSetting<T>(string key)
Expand All @@ -23,7 +24,7 @@ protected T ReadSetting<T>(string key)
{
return default(T);
}
var serializer = SettingSerializerFactory.GetSerializer<T>();
var serializer = settingSerializerFactory.GetSerializer<T>();
return setting.GetValue(serializer);
}

Expand All @@ -35,7 +36,7 @@ protected void WriteSetting<T>(string key, T value)
setting = new Setting(idGenerator.NextId(), key);
settingRepository.Add(setting);
}
var serializer = SettingSerializerFactory.GetSerializer<T>();
var serializer = settingSerializerFactory.GetSerializer<T>();
setting.SetValue(serializer, value);
}
}
Expand Down
3 changes: 2 additions & 1 deletion tests/Backend.Fx.Tests/ConfigurationSettings/TheSetting.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public class TheSetting
public class TestSettingsService : SettingsService
{

public TestSettingsService(IEntityIdGenerator idGenerator, IRepository<Setting> settingRepository) : base(idGenerator, settingRepository)
public TestSettingsService(IEntityIdGenerator idGenerator, IRepository<Setting> settingRepository)
: base(idGenerator, settingRepository, new SettingSerializerFactory())
{ }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ public class TheSettingsService
{
public class MySettingsService : SettingsService
{
public MySettingsService(IEntityIdGenerator idGenerator,IRepository<Setting> repo) : base(idGenerator, repo)
public MySettingsService(IEntityIdGenerator idGenerator, IRepository<Setting> repo)
: base(idGenerator, repo, new SettingSerializerFactory())
{
}
public int SmtpPort
Expand Down

0 comments on commit 70dfb4b

Please sign in to comment.