2009-01-16 6 views
1

Voici le problème: notre classe principale (disons: Contract) change chaque année. Certaines propriétés sont ajoutées, d'autres sont supprimées. Nous ne savons pas à quoi cela ressemblera l'année prochaine. Cela peut changer beaucoup ou pas du tout. D'autre part, nous avons maintenant (nouvelle exigence ...) de garder un historique de chaque contrat. Chaque fois que l'utilisateur met à jour un contrat, l'objet entier doit être stocké dans une sauvegarde (par exemple, sérialisé dans une table).Comment implémenter le "versioning de classe" (en utilisant une version différente de la même classe)

Bien sûr, il faut pouvoir le relire ... Une option (brutale) est d'avoir une nouvelle classe de contrat chaque année (Contrat2008, Contrat2009, ...).

Mais ce serait très lourd (et moche) car beaucoup de classes dépendent de contrat - en fait, nous devrions créer un tas de nouvelles classes chaque année.

Avez-vous déjà eu ce type de problème? Toute suggestion ?

Merci d'avance!

(Nous utilisons C# 2.0.)

AJOUTÉE: Merci pour vos réponses. Nous nous demandons maintenant comment nous pourrions utiliser un dictionnaire/un fichier XML pour implémenter le versioning sans casser tout le code. Dictionnaire semble très sexy dans ce contexte: o)

Répondre

3

Arrêtez la sérialisation de l'objet. Stockez les données de manière relationnelle. La sérialisation est prévue pour de courtes durées, par exemple comme le streaming sur le fil; pas de stockage permanent.Au lieu de coder les champs dans la classe; Il semble que vous ayez besoin de plus d'un type de structure de dictionnaire qui peut dynamiquement tirer des champs en fonction des valeurs de configuration de base de données stockées par année. Ensuite, créez une interface utilisateur dynamique basée sur ces valeurs. Devoir créer une nouvelle classe chaque année et tester le code semble impossible à maintenir.

2

Première chose que je peux penser à la tête de ma tête. Mettre en place une sorte de document "Capabilities". Une liste (ou un document XML) détaillant la version du contact et les propriétés qu'il contient.

Chaque fonction qui opère sous contrat doit vérifier si des propriétés particulières («capacités») sont prises en charge.

Par exemple:

Contract2008 Capabilities 
----- 
has Name 
has Stipulations 
can DoMagic 
----- 
>  
>  Contract2009 Capabilities 
>  ----- 
>  has Name 
>  has Stipulations 
>  can DoMagic 
>  ----- 

La classe contrat stockerait le document des capacités et des setters getters génériques. L'ensemble et get vérifie si le champ est pris en charge dans les capacités avant de définir ou d'obtenir la valeur.

(Ce doit être un motif ou quelque chose, quelqu'un?)

2

Il est fort probable que vous ne devez implémenter des propriétés que les propriétés C#. Vous pouvez réellement stocker des propriétés dans un type de dictionnaire et utiliser les méthodes Get et Set pour les lire/les énumérer. Dans ce cas, vous pouvez utiliser la même classe chaque année.

Si les propriétés ont réellement être des propriétés, alors je vous recommande de construire un nouvel assemblage avec la classe chaque année, et de charger l'assemblage dynamiquement. Vous pouvez ensuite utiliser la réflexion pour voir quelles propriétés sont prises en charge par chaque objet Contract. Pour vous faciliter la vie, je vous suggère d'avoir une interface pour les propriétés qui ne changent pas, et de simplifier l'identification de la classe Contract dans l'assemblage.

Questions connexes