Sto progettando un modo flessibile ed estensibile per memorizzare le impostazioni di configurazione per gli utenti.
Progettazione tabella database:
╔═════════════════════════════╗
║ ConfigurationItemDefinition ║
╠═════════════════════════════╣
║ ID ║
║ Name ║
║ Type ║
║ DefaultValue (varchar) ║
║ ConfigurationItemAdapterID ║
╚═════════════════════════════╝
|
╔═══════════════════════════════╗
║ ConfigurationItem ║
╠═══════════════════════════════╣
║ ID ║
║ UserID ║
║ ConfigurationItemDefinitionID ║
║ Value (varchar) ║
╚═══════════════════════════════╝
Spiegazione:
La tabella ConfigurationItemDefinition
contiene la definizione per le impostazioni di configurazione. Type
è il tipo .NET che il valore verrebbe analizzato / serializzato quando interrogato nel codice.
La tabella ConfigurationItem
è dove i valori di configurazione sono impostati per ogni utente . Se non esiste un valore impostato esplicitamente per un utente specifico per una definizione di elemento di configurazione, viene utilizzato il valore DefaultValue
da ConfigurationItemDefinition
.
ConfigurationItemAdapterID
determina quale tecnica deve essere utilizzata per "ottenere" e "impostare" il valore di configurazione. Ad esempio, un valore int
userebbe un Parse di base (da string - > int). Un oggetto CultureInfo
dovrebbe utilizzare un adattatore di serializzazione. Il modo in cui i valori di configurazione vengono ottenuti e impostati è determinato dall'adattatore (esempi di seguito).
Codice C #
In C #, un'impostazione sarebbe acquisita in questo modo:
// This would use the Parse adapter
int timeout = someUser.GetConfigurationValue<int>("TimeoutValue");
// This would use the Serialization adapter
CultureInfo cultureInfo = someUser.GetConfigurationValue<CultureInfo>("CultureInformation");
E imposta come segue:
// This would use the Parse adapter
someUser.SetConfigurationValue<bool>("IsLive", true);
Si prega di criticare questo design. Esistono altri modi standard per affrontare un simile problema?