You can file this under “Do I really need this?” but for now I kind of like it. That, however, may change in the next hour.
The idea is simple, create a class that uses the ConfigurationManager AppSettings NameValueCollection (Triple Combo!) but only presents properties that represent the keys in the .config file. This way there is no guessing of how the key is spelled or that that type returned is converted to something it should be. (Say you have a numeric value in the .config file) Now this doesn’t seem like a big deal, but I’m not happy with something that is just simple like:
public String SomeKey { get { return System.Configuration.ConfigurationManager.AppSettings["SomeKey"]; } }
Oh no, that’s just not good enough. Call it divine intervention. Call it spontaneous brilliance. Call it whatever the guy that invented the corn dog had. But what I came up with is far better. (And by better I mean more complex)
Remember, the idea isn’t to have to grab just the value from System.Configuration.ConfigurationManager.AppSettings but also to have it be typed on the way back. Now we know this to be true: I am awesome. What we also know to be true is that the value held in the appSettings area of the .config file is going to correspond to a value type but is going to be read in as a string. If you’ve read some of my posts (Which I assume you haven’t), you might have stumbled upon this little gem and know that I already have something to convert from a string to pretty much any value type. (Those having a TryParse method) So the converting part is already done, but what about the getting?
protected static T? GetValueFromConfiguration<T>(String key) where T : struct { T? returnValue = null; if (System.Configuration.ConfigurationManager.AppSettings[key] != null) { returnValue = System.Configuration.ConfigurationManager.AppSettings[key] .ConvertTo<T>(); //MY AWSOME CONVERTTO METHOD!!11 } return returnValue; }
Ok so you can see, this is really simple. I check to see if the key exists, get the value from the .config file, and convert to whatever I said it should. In use this would be:
public static DateTime? TestDate { get { return GetValueFromConfiguration<DateTime>("TestDate"); } }
Now you might have noticed something about this… yes besides the fact that it’s Mentos fresh. First, the method returns nullable versions. The reason for doing this is you really don’t know what the value will be in the .config file. Say this was an integer and you returned just a normal integer. (Non nullable) What would you set the value to? Sure you could do minimum value but COULD mean that there was a value in the .config file. This is more of a design choice though.
Second is that the method doesn’t cover strings. This is an ouch due to how nullables and strings work. You can’t return a nullable string since string doesn’t fit in the non nullable value category. This is a real pain but easily overcome with a non generic overload:
protected static String GetValueFromConfiguration(String key) { String returnValue = null; if (System.Configuration.ConfigurationManager.AppSettings[key] != null) { returnValue = System.Configuration .ConfigurationManager.AppSettings[key]; } return returnValue; }
See? Easy way to side step the problem. There might be a better way to handle that, but not sure at this point. Something to revisit I suppose. Oh and here’s the whole class for the hell of it:
public class BaseConfigurationManager { private const String SOME_KEY = "SomeKey"; protected static T? GetValueFromConfiguration<T>(String key) where T : struct { T? returnValue = null; if (System.Configuration.ConfigurationManager.AppSettings[key] != null) { returnValue = System.Configuration.ConfigurationManager.AppSettings[key] .ConvertTo<T>(); } return returnValue; } protected static String GetValueFromConfiguration(String key) { String returnValue = null; if (System.Configuration.ConfigurationManager.AppSettings[key] != null) { returnValue = System.Configuration.ConfigurationManager.AppSettings[key]; } return returnValue; } public static String SomeKey { get { return GetValueFromConfiguration(SOME_KEY); } } }
Oddly enough I spelled “spontaneous brilliance” correctly the first time around but thought “numeric” had a silent ‘b’. Go figure. Should have finished middle school.