Ho una libreria che fornisce una logica comune per la lettura delle impostazioni da più fonti.
la libreria utilizza una catena di responsabilità per popolare istanze di oggetti che conterranno i valori delle impostazioni. Di seguito, un esempio di utilizzo
[Settings]
public class FooSettings
{
[Config(Key = "Foo", Required = false)]
public string Foo { get; set; }
}
...
//Main, Global.asax, etc
SettingsFactory.SetDataSource(new AppConfigSource()); //type: IDataSource
//Usage
var fooSettings = SettingsFactory.GetSettings<FooSettings>();
la catena è questa
ISerializer serializer = new ComplexSerializer(//deserialize [Settings]
new RequiredSerializer( //throws if a required prop cannot be found
new ValueTypeSerializer(
new ReferenceTypeSerializer())));
foreach(var propertyInfo in properties)
{
// the serializer will query the type of the propertyInfo and deserialize to the proper type
propertyInfo.SetValue(_instance, serializer.Deserialize(propertyInfo, value);
}
l'interfaccia IDataSource
, che ha un unico metodo che restituisce una stringa basata su un parametro chiave, può essere facilmente utilizzata per un decoratore che può memorizzare nella cache i valori di configurazione senza raggiungere l'origine dati effettiva, mentre l'interfaccia ISerializer
è nascosto nella mia applicazione manca tale capacità dall'esterno.
Potrei aggiungere alcuni booleazi statici qua e là per utilizzare alcuni metodi di memorizzazione nella cache comuni, ma questo danneggerà il design.
Qualche suggerimento per aggiungere un punto di estensione a questa catena? Il SettingsFactory
sopra più gli attributi sono gli unici tipi esportati dall'assembly.