2009-08-17 7 views
0

J'ai un cadre de classes. Chaque classe représente une entité et possède des méthodes statiques de base: Ajouter, Obtenir, Mettre à jour et Supprimer.Comment développer des méthodes qui ont la même fonctionnalité pour certaines entités?

Cette méthode est statique car je souhaite autoriser une action sans instanciation de l'objet. Par exemple, pour ajouter un objet, je dois faire ceci: Foo.Add (foo).

Maintenant, je veux avoir un certain nombre de méthodes qui seraient invoquées à partir d'un autre cadre pour chaque classe. Mais la fonctionnalité de cette méthode sera la même: par exemple je veux vérifier si l'objet existe et si ce n'est pas le cas - créer, sinon - mettre à jour.

Quelle est la meilleure approche pour l'implémenter?

dois-je faire de cette manière pour toutes les classes:

Par exemple:

public void DoSomethingWithFoo(Foo foo) 
{ 
    if (Foo.Get(foo.id) != null) 
     Foo.Update(foo); 
    else 
     Foo.Add(foo); 
} 

public void DoSomethingWithBar(Bar bar) 
{ 
    if (Bar.Get(bar.id) != null) 
     Bar.Update(bar); 
    else 
     Bar.Add(bar); 
} 

Ou est-il préférable de le faire en utilisant InvokeMember (selon idée d'avoir tout le code dans un endroit) ?

.: par exemple

public void DoSomethingWithFoo(Foo foo) 
    { 
     DoSomethingWithObject(foo); 
    } 

    private void DoSomethingWithObject(object obj) 
    { 
     Type type = obj.GetType(); 

     object[] args = {type.GetProperty("ID").GetValue(obj, null)}; 
     object[] args2 = { obj }; 
     if (type.InvokeMember("Get", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args) != null) 
     { 
      type.InvokeMember("Update", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args2); 
     } 
     else 
     { 
      type.InvokeMember("Add", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args2); 
     } 
    } 

Quelle est la meilleure approche et plus propre? Ou peut-être que vous proposerez une autre approche?

Merci

Répondre

0

Bien. Je veux dire d'abord que je ne voudrais pas écrire votre propre cadre d'entité et utiliser quelque chose comme LLBLGen.

Deuxièmement, je dirais, si vous ignorez ce conseil, vous voulez une super classe comme

public abstract class SavableBase 
{ 
    protected abstract void Add(); 
    protected abstract void Update(); 

    public void Save() 
    { 
    if(!saved){ 
     Add(); 
    } else { 
     Update(); 
    } 
    } 
} 

Et puis mettre en œuvre ces méthodes de façon appropriée.

+0

En fait, j'utilise déjà NHibernate à cette fin. Mais la question est de savoir comment organiser les méthodes (qui ont la même fonctionnalité que je l'ai décrit plus haut) qui accèdent aux objets qui se trouvent dans le cadre principal? Nous accédons donc aux objets à partir d'une autre bibliothèque. –

+0

Droite. Eh bien, je l'ai décrit. –

Questions connexes