2017-11-04 3 views
0

Ich habe die folgende Klasse, die eine große, statische XML-Datei in ein Wörterbuch lädt. Ich möchte, dass es nur einmal das XML lädt, wenn es referenziert wird.C# Singleton Wörterbuch Klasse

public class MyClass 
{ 

    private static readonly string _xmlfile = $"{path.db}database.xml"; 

    public Dictionary<string, MyXML> content; 

    public MyClass() 
    { 

     var d = XMLHelper.Deserialize<MyXMLs>(_xmlfile); 

     content = d.content; 

    } 

} 

Ich habe versucht, die Hauptfunktion von diesem Artikel folgende https://www.codeproject.com/Articles/14026/Generic-Singleton-Pattern-using-Reflection-in-C

Aber könnte nicht ganz im Wörterbuch übersetzen

+0

das Wörterbuch auf Statisch eingestellt und erklären Deserialize in einem statischen Konstruktor –

+0

Haben Sie versucht, den Lazy-Ansatz zu verwenden. Lazy _orders = new Lazy (() => neue Bestellungen (100)); – Seb

Antwort

1

Verwenden Jon Skeet voll faul und thread-safe Singletonmuster: http://csharpindepth.com/Articles/General/Singleton.aspx

public sealed class Singleton 
{ 
    private Singleton() 
    { } 

    public static Singleton Instance { get { return Nested.instance; } } 

    private class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { } 

     internal static readonly Singleton instance = new Singleton(); 
    } 
} 

oder seine Muster mit dem Lazy<T> Typ

public sealed class Singleton 
{ 
    private static readonly Lazy<Singleton> lazy = 
     new Lazy<Singleton>(() => new Singleton()); 

    public static Singleton Instance { get { return lazy.Value; } } 

    private Singleton() 
    { } 
} 
0

ist, sollten Sie faul Initialisierung verwenden. Versuchen Sie folgendes:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyClass myClass = new MyClass(); 
     MyClass.MyXML xml = myClass["someKeyValue"]; 
    } 
} 


public class MyClass 
{ 
    private class Path 
    { 
     public string db; 
    } 
    public class MyXML { } 



    private static Path path = new Path(); 

    private static readonly string _xmlfile = $"{path.db}database.xml"; 

    private Dictionary<string, MyXML> content = new Dictionary<string, MyXML>(); 

    public MyXML this[string key] 
    { 
     get 
     { 
      MyXML value = content[key]; 
      if(key == "someKeyValue" && value == null) 
      { 
       value = getXmlFromFile(_xmlfile); 
       content[key] = value; 
      } 
      return value; 
     } 
    } 

    public MyClass() 
    { 

    } 

    private MyXML getXmlFromFile(string path) 
    { 
     return XMLHelper.Deserialize<MyXMLs>(path).content; 
    } 

}