- Assume that I have application that needs to use AppConfig values.
 - There could be OptionsView that could allow to change some values during runtime and save them.
 - moreover others ViewModels use AppConfig values during runtime. E.g there is LogViewModel that can enlist logs and according to AppConfig value add additional infos e.g. timestamp of every log.
 
I would like to know what is the good practise of using AppConfig.
Should I consider Preparing one AppConfig Class which could implement IAppConfig and Inject it into every ViewModel - in such situation I should inject it via constructor and use like with wrapped interface - provider:
private readonly IAppConfigProvider _appConfigProvider;
    private IAppConfigProvider AppConfigProvider
    {
        get
        {
            return _appConfigProvider.ProvideAppConfig();
        }
    }
public interface IAppConfigProvider 
{
    IAppConfig ProvideAppConfig();
    void SetAppConfig(IAppConfig mainConfig);
}
Thanks to above construction I ensure that every ViewModel or Service that has Injected AppConfig has same instance of AppConfig
However, is that solution is not an overkill, overengineering?
Maybe I should prepare static AppConfig class. I know that in second case I cannot use mocking via interface.
public class AppConfig : IAppConfig
{
    public AppConfig()
    {
        var exePath = Assembly.GetExecutingAssembly().Location;
        _config = ConfigurationManager.OpenExeConfiguration(exePath);
    }
    public bool SampleProperty
    {
        get { return GetSettings(AppConfigKey.SampleProperty.GetName()) == "1"; }
        set
        {
            SetSettings(AppConfigKey.SampleProperty.GetName(), Convert.ToInt32(value).ToString(CultureInfo.InvariantCulture));
        }
    }
}
Which solution would be better?