2010-10-17 7 views
0

Je joue autour avec SQLite et attributs, et j'avoir des propriétés tout au long de mon code qui ressemble à ceci:Comment est-ce que je peux réduire le passe-partout dans mes propriétés en utilisant des attributs?

const string FooKey = "foo"; 

... 

string m_foo; 
[DatabaseColumn (FooKey)] 
public string Foo { 
    get { return m_foo; } 
    set { 
     if (m_foo == value) 
      return; 

     m_foo = value; 
     OnFooChanged(); // Calls the event FooChanged after a null check 
     Update (FooKey, Foo); // Updates the field in the database 
    } 
} 

Ceci est identique pour chaque propriété qui correspond à une colonne dans la table, avec les seuls changements étant le nom et le type. À savoir, il pourrait y avoir une autre propriété comme celui-ci:

const string BarKey = "bar"; 

... 

bool m_bar; 
[DatabaseColumn (BarKey)] 
public bool Bar { 
    get { return m_bar; } 
    set { 
     if (m_bar == value) 
      return; 

     m_bar = value; 
     OnBarChanged(); // Calls the event BarChanged after a null check 
     Update (BarKey, Bar); // Updates the field in the database 
    } 
} 

En ce moment, je n'utilise que l'DatabaseColumn attribut pour identifier les champs qui correspondent aux colonnes de la table, afin que je puisse plus facilement insérer toute la ligne dans la base de données. Y at-il un moyen d'en faire plus de la responsabilité de DatabaseColumn, de réduire la norme dans mon code?

+0

IMHO mettre à jour le DB dès que la propriété est mise à jour n'est pas une très bonne idée ... Regardez les cadres ORM existants, aucun d'entre eux fonctionnent comme ça, donc il y a probablement de bonnes raisons pour cela (au dessus de ma tête, je peux penser à 2: l'efficacité et l'intégrité des données/la cohérence) –

+0

@Thomas: Merci, je vais jeter un coup d'oeil autour. Je n'ai jamais fait d'ORM auparavant - il existe peut-être déjà un cadre qui répond à mes besoins. –

+0

oui, il est certainement;). Ecrire un ORM est * dur *, donc à moins que vous ayez des besoins très spécifiques, je recommanderais d'en utiliser un existant (Entity Framework est plutôt bon, NHibernate est aussi largement utilisé mais beaucoup plus difficile IMO) –

Répondre

2

Que diriez-vous quelque chose de départ:

private void SetField<T>(
    ref T field, T value, 
    string key, EventHandler handler) 
{ 
    if(EqualityComparer<T>.Default 
     .Equals(field, value)) return; 
    field = value; 
    if(handler!=null) handler(this, EventArgs.Empty); 
    if(key!=null) Update(key,value); 
} 
public int Foo { 
    get { return foo; } 
    set { SetField(ref foo, value, FooKey, FooChanged); } 
} 
question

Re re d'utiliser les attributs; cela introduit une réflexion relativement lente. Je voudrais l'éviter si possible.

+0

Merci, cela fonctionne très bien. Je dois prendre l'habitude d'utiliser ces méthodes génériques. –

Questions connexes