2010-10-25 3 views
1

En supposant que j'ai des données sous forme deBesoin d'aide avec un bon design pour beaucoup à une relation avec sérialisation XML en C#

Customer1 
Name 
Address 
Order1 
    ID 
    Products 
    Product1 
    ID 
    Product2 
    ID 
Customer2 
... 

Utilisation de la classe suivante pour le représenter

class Customer 
{ 
public String name { get; set; } 
public String Address {get; set;} 
public List<OrderInfo> Orders { get; set; } 
} 

class Order 
{ 
public int ID { get; set; } 
public List<Product> Products { get; set; } 
} 

class Product 
{ 
public int ID { get; set; } 
} 

I J'aimerais utiliser la sérialisation XML pour lire/écrire les données au lieu d'utiliser le framework d'entités et SQL. Avec le framework d'entités, je serais capable de définir une relation many-to-one afin que chaque produit ne soit stocké qu'une seule fois dans la base de données et que chaque commande ne ferait que le référencer. En utilisant le code ci-dessus avec la sérialisation XML, je crois comprendre qu'il y aurait de nombreuses copies de chaque produit stockées (à la fois dans la mémoire et dans le fichier XML). Pour résoudre ce problème, je pouvais simplement stocker une liste d'ID de produit au lieu de produits eux-mêmes, puis sérialiser juste une collection séparée de 'produits' vers un autre fichier XML - mais cela ne me semble pas une solution propre.

Une autre idée serait d'avoir un RepositoryClass qui contenait une liste de clients et de produits. Les clients auraient alors seulement besoin de stocker les productIDs et quand vous demanderiez un 'client' au repo, ils s'occuperaient de la recherche et de la construction des objets ci-dessus pour que le reste de mon code n'ait pas à se soucier du stockage des données . Est-ce que cela ressemble à une meilleure solution? Comment le feriez-vous?

L'autre exigence pour la solution est que je veux aussi simple que possible de brancher la solution à l'interface graphique pour éditer les propriétés directement (c'est pourquoi je souhaite un moyen de stocker tout dans un fichier XML que je pourrait juste se lier à une fenêtre WPF).

Merci d'avance pour vos avis et conseils!

Répondre

1

Il n'y aurait pas de copies stockées en mémoire car vous pourriez instancier un produit spécifique une seule fois et faire référence à ce produit à partir de ce moment.

Le cas de xml est un peu plus compliqué. La spécification XML a une solution pour cela, mais je ne suis pas sûr que le framework .NET le supporte. Vous pourriez avoir un document XML comme ceci:

<rootElement> 
    <Customers> 
     <Customer ...> 
      <Order> 
       <ProductRef ref="1" /> 
       <ProductRef ref="2" /> 
      </Order> 
     </Customer> 
    </Customers> 
    <Products> 
     <Product id="1" /> 
     <Product id="2" /> 
     <Product id="3" /> 
     <Product id="4" /> 
    </Products> 
</rootElement> 

Un analyseur XML de validation validera que id « s sont uniques dans le document et que chaque ref attribut se réfère en fait à un id si vous spécifiez un schéma DTD ou XML cela nécessite

Bien sûr, vous devrez toujours construire quelque chose qui analyse cette structure, mais vous n'avez plus de données XML en double.

+0

Comment le sérialiseur sait-il instancier un produit spécifique une seule fois et y faire référence à partir de ce moment au lieu de traiter chaque élément XML comme une nouvelle instance lorsqu'il est désérialisé? Je peux être capable de vivre avec d'énormes fichiers de données si cela n'aboutit pas à une utilisation folle de la mémoire une fois le programme chargé :). Merci pour votre réponse! – Evan

+0

Vous ne pouvez plus utiliser le support de sérialisation XML standard que .NET offre lorsque vous adoptez cette approche, malheureusement .. –

+0

Seriez-vous capable d'utiliser le [DataContract] de WCF avec une application de bureau WPF pour ce faire? – Evan

Questions connexes