30/11/2018 Introducing SimpleSamSettings - CodeProject
Introducing SimpleSamSettings
outbred, 17 Oct 2018
A simple (duh!), Cross-Platform, and Scalable Settings Framework
Download source file - 8.4 KB
Introduction
SimpleSamSettings is a framework based on the idea that many distinct settings classes are better than one huge one.
Persistence is configurable (Save after every change? Turn off persistence for in memory only?), as is the location.
Every application requires user-, application-, and other defined settings. The maintenance of these settings can be horrendous
over time if not property architectured and maintained.
SimpleSamSettings aims to ease the burden of creating, managing, saving, and restoring settings for any application in
.NET Standard.
Available on nuget here and github here.
Background
This architecture has been in my production code for many years now, and I've recently re-written it for the open source
community. Tried and true, hopefully it can handle anything you throw at it!
Using the Code
public class MySettings : OverwriteSettingsProfile<MySettings>
{
public string SomeProp
{
get => Get<string>();
set => Set(value);
}
}
Globals.SettingsFileBasePath = Path.Combine(Environment.GetFolderPath
(Environment.SpecialFolder.ApplicationData), "MyAppName");
That's it! Your settings will be persisted to %appdata%/MyAppName/MySettings.settings in JSON format. Prefer binary? No
problem! Put the [Serializable] tag on it and it will auto-serialize as binary.
By default, each change updates the file on disk. To turn off this behavior, simply set AutoSave to false, like this:
var settings = new MySettings() { AutoSave = false };
https://www.codeproject.com/Articles/1263458/Introducing-SimpleSamSettings?display=Print 1/3
30/11/2018 Introducing SimpleSamSettings - CodeProject
...then at any time, you can save it (say, on application exit):
settings.SaveInstance() OR MySettings.Save(); // OverwriteSettingsProfile<>
// ensures a singleton instance, so it is a static
helper method
Undoing Settings Changes - The Easy Way!
Say you have a dialog open for the user to change settings. The settings changes are live, ideally, but if the user clicks 'Cancel'
everything they've done during the lifetime of that dialog should be undone. Easy peasy!
Simply set the 'MakeUndoable' flag in the base to true.
settings.MakeUndoable = true;
... do your stuff in the dialog ...
To cancel or undo everything:
settings.RevertChanges();
Then set MakeUndoable back to false so it doesn't save off changes:
settings.MakeUndoable = false;
Usage Advice
Encapsulate your settings into small classes - many, properly encapsulated classes is preferred over one or a few very large
ones! This makes it easier to maintain, easier to use and reuse, and speeds up disk I/O.
NOTE
If a collection or object inside the settings class changes, the file will not be autosaved. It is recommended that the settings class
listens for changes on those objects and auto-saves them, as appropriate, but this is in no way enforced and left entirely up to the
consumer (you). Happy settings coding!
History
15th October, 2018: Initial public release
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
About the Author
https://www.codeproject.com/Articles/1263458/Introducing-SimpleSamSettings?display=Print 2/3
30/11/2018 Introducing SimpleSamSettings - CodeProject
outbred
Software Developer (Senior)
United States
Senior Software Developer/Lead/Architect for all things .NET/C#. Passionate about the SDLC and architecture.
Comments and Discussions
10 messages have been posted for this article Visit https://www.codeproject.com/Articles/1263458/Introducing-
SimpleSamSettings to post and view comments on this article, or click here to get a print view with messages.
Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile Article Copyright 2018 by outbred
Web03 | 2.8.181129.1 | Last Updated 17 Oct 2018 Everything else Copyright © CodeProject, 1999-2018
https://www.codeproject.com/Articles/1263458/Introducing-SimpleSamSettings?display=Print 3/3