2010-11-17 4 views
6

Ähnlich zu dieser Frage: C# Constructor Design aber diese Frage ist geringfügig anders.C# Wo werden Anfangsdaten in einem Objekt geladen?

Ich habe eine Klasse Customer und eine Klasse CustomerManager. Wenn eine Instanz der CustomerManager-Klasse erstellt wird, möchte ich alle Kunden laden. Und hier blieb ich stecken. Ich kann dies mehrere Möglichkeiten:

  1. laden alle Kunden im Konstruktor (ich mag diese nicht, weil es eine Weile dauern kann, wenn ich viele Kunden habe)
  2. In jedem Verfahren des Customer Klasse, die Datenbank im Zusammenhang Aktionen ausführt, überprüfen Sie die lokale Liste der Kunden geladen wird und wenn nicht, laden Sie die Liste:

    public method FindCustomer(int id) 
    { 
        if(_customers == null) 
        // some code which will load the customers list 
    } 
    
  3. erstellen Sie eine Methode, die alle Kunden lädt. Diese Methode muss vor dem Aufruf von Methoden aufgerufen werden, die Datenbank im Zusammenhang Aktionen ausführt:

    In der Klasse:

    public LoadData() 
    { 
        // some code which will load the customers list 
    } 
    

    In der Form:

    CustomerManager manager = new CustomerManager(); 
    manager.LoadData(); 
    Customer customer = manager.FindCustomer(int id); 
    

was den besten Weg ist, zu tun Dies?

EDIT:

Ich habe das Gefühl, dass ich hier falsch verstanden werde. Vielleicht liegt es daran, dass ich nicht klar genug war. In der CustomerManager-Klasse habe ich mehrere Methoden, die von der lokalen Liste (_customers) abhängt. Also, meine Frage ist, wo sollte ich diese Liste füllen?

+0

Wenn Sie "Form" sagten, ich glaube, es spielt eine Rolle, ob Sie WebForm oder WinForm gemeint haben; Ich würde das jeweils anders implementieren, da auch Caching involviert ist. Also, welche meintest du? – BeemerGuy

+0

Ich benutze Winforms – Martijn

+0

Ich denke, Sie müssen mehr (nach Ihrem EDIT) erarbeiten. Es ist nicht klar, warum Lazy Loading nicht in Ihrer 'CustomerManager' Klasse funktioniert, solange Sie' _customers' zu den faulen 'Customers' oder zu' Lazy 'ändern und stattdessen intern auf' _customers.Value' verweisen. –

Antwort

9

Was Sie beschreiben, ist "Lazy Loading".

Ein einfacher Ansatz ist es, eine Privateigentum wie diese haben:

private Lixt<Customer> _customers; 
private List<Customer> Customers 
{ 
    get 
    { 
    if(_customers == null) 
     _customers = LoadData(); 
    return _customers; 
    } 
} 

Dann Sie Customers intern verweisen. Die Kunden werden beim ersten Mal geladen, aber nicht früher.

Dies ist ein solches gemeinsames Muster, das .NET 4.0 eine Lazy<T> Klasse hinzugefügt, die dies für Sie tut.

ich, dass Fall definieren Sie es einfach als ein privates wie folgt aus:

private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData); 

Dann Sie einfach Ihren Kunden in Code verweisen:

_customers.Value 

Die Klasse wird den Wert mit initialisieren Ihre LoadData() Methode.

Wenn Sie nicht auf .NET 4.0 noch sind, die Lazy<T> Klasse ist sehr einfach zu implementieren.

+1

+1 für das Anzeigen von mir 'Lazy '. – Heinzi

+0

Das ist nicht, was ich meinte, bitte sehen Sie meine Änderungen. Anyway +1 für die Lazy Ansatz – Martijn

+0

Ich nehme an, ich bin verwirrt. Warum können Sie diesen Ansatz nicht in Ihrer CustomerManager-Klasse verwenden? –

5

Verwenden Sie eine Eigenschaft für den Zugriff auf die Kunden. Überprüfen Sie, ob die Kunden geladen sind.

2

Nun, es kommt darauf an. Alle Ihre Möglichkeiten haben Vor- und Nachteile.

Die gute Sache über Optionen 1 und 3 ist, dass der Benutzer die volle Kontrolle über hat, wenn der (lange) Datenladevorgang durchgeführt wird. Ob Option 1 oder 3 besser ist, hängt davon ab, ob es sinnvoll ist, den Manager zu erstellen und die Daten später zu laden. Persönlich bevorzuge ich eine separate LoadData Methode, wenn es eine langwierige Operation ist, aber das könnte eine Frage des Geschmacks sein.

Das Gute an Option 2 ist, dass die Daten nicht geladen werden, wenn sie nicht benötigt werden. Der Nachteil ist, dass die (lange) Belastung als Nebeneffekt des ersten Zugriffs auftritt, was Ihr Programm "weniger deterministisch" macht.

Im Prinzip sind alle Optionen, die Sie vorgestellt haben, eine gute und gültige Wahl. Es hängt wirklich von Ihren Anforderungen ab.

Verwandte Themen