2011-08-08 1 views
2

Je suis en train d'écrire un programme qui va manipuler certains objets, appelons-les "Mots". Chaque mot est une instance de l'une de plusieurs classes. Il peut y avoir beaucoup, beaucoup de ces à la fois.C# fichier de données aux objets

Chacun de ces objets Word doit avoir accès à un dictionnaire, stocké dans un fichier XML. Je ne pense pas que chaque objet Word devrait charger le fichier XML séparément. Les objets Word doivent pouvoir accéder à un pool global de données de programme.

Quelle est la meilleure façon de gérer cela? Dois-je avoir une classe appelée ProgramData qui contient le document XML et est passée à chaque objet Word quand ils sont créés? Cela ne provoquera pas le chargement de plusieurs instances du fichier XML en mémoire, n'est-ce pas? Puis-je faire ce que je veux faire sans passer ProgramData à chaque nouvel objet?

Répondre

2

Vous devez charger le fichier XML dans une instance de ProgramData, puis passer cette instance dans chaque instance Word (peut-être dans le constructeur). Vous pouvez également créer une propriété statique dans la classe Word que vous définissez avant de commencer à instancier Word s, mais veillez à utiliser lock pour la sécurité des threads. Votre alternative est le Singleton pattern, mais croyez-moi, vous don't want to go down that road.

Edit: Pour être plus clair, c'est la première option (celle que je aimerais utiliser):

public class Word 
{ 
    private ProgramData _Data 
    public Word(ProgramData data) 
    { 
     _Data = data; 
    } 

    public void MethodThatUsesData 
    { 
     // _Data.TryGetValue() 
    } 
} 

// in your main method or initialization routine: 
ProgramData data = MethodThatLoadsData(); 
Word w = new Word(data); 
+0

Pourquoi un verrouillage est-il nécessaire? Le code d'OP est mono-thread, il peut simplement définir la propriété statique avant de l'utiliser. En outre, le verrouillage est probablement au-dessus du niveau de l'OP en ce moment. – KyleM

+0

Je ne fais aucune hypothèse sur le monofiletage, ni la capacité technique des OP à utiliser des constructions de verrouillage correctes. Si ce sera un set-and-forget, le verrouillage peut ne pas être nécessaire, mais c'est quelque chose pour lui/elle à considérer. – drharris

+1

Assez juste. Pour reformuler ... mon commentaire précédent consistait surtout à avertir l'OP que définir la propriété statique en premier est suffisant, et s'il le fait, il n'a pas besoin de s'inquiéter de la sécurité du thread ou du verrouillage. Ne pas essayer de le frapper, et +1 pour votre réponse. :) – KyleM

1

Votre classe ProgramData peut avoir une variable statique pour le XmlDocument et donc vous n'aurez pas passer la variable à travers un constructeur; votre autre classe peut simplement référencer ProgramData.YourVariable. Pour répondre à votre autre question, non, cette approche ne provoquera pas le chargement en mémoire de plusieurs instances du fichier XML, et l'approche de drharris ne le sera pas non plus. De plus, gardez à l'esprit que cette information s'applique à tous les langages de programmation orientés objet (du moins ceux que je connais), et pas seulement C#. Si vous chargez le document XML en mémoire une fois dans une méthode appelée myMethod(), et myMethod() n'est appelée qu'une seule fois ... devinez quoi, ce document XML ne sera chargé en mémoire qu'une seule fois. Seules les choses que vous avez codé pour arriver, ou qu'un autre dev codé (et vous avez appelé directement ou indirectement) se produira. Il n'y a pas de magie.

Questions connexes