Disons que j'ai une classe/interface de base commune.
interface ICommand
{
void Execute();
}
Il y a ensuite quelques commandes qui héritent de cette interface.
class CommandA : ICommand
{
int x;
int y;
public CommandA(int x, int y)
{ ... }
public void Execute () { ... }
}
class CommandB : ICommand
{
string name;
public CommandB(string name)
{ ... }
public void Execute () { ... }
}
Je veux maintenant stocker ces commandes dans une base de données, avec une méthode commune, puis les charger ultérieurement depuis la base de données dans un fichier de type List<ICommand>
et exécuter la méthode Execute de ceux-ci.
Pour l'instant, je n'ai qu'une seule table dans la base de données, appelée commandes, dans laquelle je stocke la sérialisation de l'objet sous forme de chaîne. En fait, les colonnes de la table sont les suivantes id|commandType|commaSeparatedListOfParameters
. Bien que cela soit très facile et fonctionne bien pour chargement de tous les commandes, je ne peux pas requête les commandes facilement sans utiliser substring et autres méthodes obscures. J'aimerais avoir un moyen simple de SELECT id,x,y FROM commandA_commands WHERE x=...
et en même temps avoir un moyen générique de charger toutes les commandes de la table des commandes (je suppose que ce serait une sorte d'UNION/JOIN de commandA_commands, commandB_commands, etc).
Il est important que l'ajout d'une nouvelle commande ne nécessite pas beaucoup de manipulations manuelles dans la base de données, ou la création manuelle de méthodes de sérialisation/parse. J'en ai des tonnes et de nouvelles sont ajoutées et supprimées en permanence. Cela ne me dérange pas de créer un outil de génération de commandes, de tables et de requêtes si cela s'avère nécessaire pour obtenir la meilleure solution.
Le mieux que je puisse faire est de créer une table commune du type id|commandType|param1|param2|param3|etc..
ce qui n'est pas beaucoup mieux (en fait, pire ?) que ma solution actuelle, car de nombreuses commandes vont avoir besoin de paramètres nuls et le type de données va varier, ce qui m'oblige à recourir à nouveau à la conversion de chaîne de caractères commune et à dimensionner chaque champ suffisamment grand pour la plus grande commande.
La base de données est SQL Server 2008
Edit : J'ai trouvé une question similaire ici Conception d'une base de données SQL pour représenter la hiérarchie des classes OO