अपनी सेटिंग्स को लगातार तरीके से एनकैप्सुलेट करना एक बेहतरीन विचार है।
मैं जो करता हूं वह एक सेटिंग क्लास या तो एक स्टैटिक ग्लोबल एक या मल्टीपल इंस्टेंस क्लासेस बनाता है जिसे मैं फिर डिपेंडेंसी इंजेक्शन के साथ मैनेज करूंगा। फिर मैं स्टार्ट अप पर उस क्लास में कॉन्फ़िगरेशन से सभी सेटिंग्स लोड करता हूं।
मैंने एक छोटी सी लाइब्रेरी भी लिखी है जो प्रतिबिंब का उपयोग इसे और भी आसान बनाने के लिए करती है।
एक बार मेरी सेटिंग्स मेरी कॉन्फिग फ़ाइल में हैं
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Domain" value="example.com" />
<add key="PagingSize" value="30" />
<add key="Invalid.C#.Identifier" value="test" />
</appSettings>
</configuration>
मैं अपनी आवश्यकताओं के आधार पर एक स्थिर या उदाहरण वर्ग बनाता हूं। केवल कुछ सेटिंग्स के साथ सरल अनुप्रयोगों के लिए एक स्थिर वर्ग ठीक है।
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
फिर Inflate.Static
या तो मेरे पुस्तकालय कॉल का उपयोग कर या Inflate.Instance
शांत बात यह है कि मैं किसी भी महत्वपूर्ण मूल्य स्रोत का उपयोग कर सकता हूं।
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
इसके लिए सभी कोड GitHub में https://github.com/Enexure/Enexure.Fire.Configuration पर है
यहां तक कि एक नगेट पैकेज भी है:
PM> इंस्टॉल-पैकेज Enexure.Fire.Configuration
संदर्भ के लिए कोड:
using System;
using System.Linq;
using System.Reflection;
using Fire.Extensions;
namespace Fire.Configuration
{
public static class Inflate
{
public static void Static( Type type, Func<string, string> dictionary )
{
Fill( null, type, dictionary );
}
public static void Instance( object instance, Func<string, string> dictionary )
{
Fill( instance, instance.GetType(), dictionary );
}
private static void Fill( object instance, Type type, Func<string, string> dictionary )
{
PropertyInfo[] properties;
if (instance == null) {
// Static
properties = type.GetProperties( BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly );
} else {
// Instance
properties = type.GetProperties( BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly );
}
// Get app settings and convert
foreach (PropertyInfo property in properties) {
var attributes = property.GetCustomAttributes( true );
if (!attributes.Any( x => x is Ignore )) {
var named = attributes.FirstOrDefault( x => x is Named ) as Named;
var value = dictionary((named != null)? named.Name : property.Name);
object result;
if (ExtendConversion.ConvertTo(value, property.PropertyType, out result)) {
property.SetValue( instance, result, null );
}
}
}
}
}
}