Я бы предпочел внедрить IAppSettings
в каждый класс, который в этом нуждается, просто чтобы уберечь их от скрытой зависимости от Settings
. Вопрос в том, действительно ли вам нужно распространить эту зависимость на каждый класс?
Если вы действительно хотите пойти со статическим Settings
классом, я бы по крайней мере попытался сделать его пригодным для тестирования / подделкой. Учтите это:
public static class Settings
{
public static Func<IAppSettings> AppSettings { get; set; }
}
А где вы строите свой контейнер:
var builder = new ContainerBuilder();
...
var container = builder.Build();
Settings.AppSettings = () => container.Resolve<IAppSettings>();
Это позволило бы поменяться с подделками во время теста:
Settings.AppSettings = () => new Mock<IAppSettings>().Object;
Теперь класс AppSettings
(который, как я полагаю, есть только один) вы могли бы сделать с помощью обычной инжекции конструктора. Я также предполагаю, что вы действительно хотите разрешать каждый вызов свойств ваших настроек, добавляя, таким образом, фабричный делегат, который извлекает экземпляр при необходимости. Если это не нужно, вы, конечно, должны напрямую подключить сервис IConfigurationSettings
.
public class AppSettings : IAppSettings
{
private readonly Func<IConfigurationSettings> _configurationSettings;
public AppSettings(Func<IConfigurationSettings> configurationSettings)
{
_configurationSettings = configurationSettings;
}
public string Setting1
{
get
{
return _configurationSettings().AppSettings["setting1"];
}
}
public string Setting2
{
get
{
return _configurationSettings().AppSettings["setting2"];
}
}
}