2012-04-07 11 views
4

Welches ist mehr bevorzugte Möglichkeit, Business-Objekt (und warum) zu implementieren?Business-Objekt mit Kontext oder nicht?

Ohne separaten "Kontext"

class Product 
{ 
    public string Code { get; set; } 

    public void Save() 
    { 
     using (IDataService service = IoC.GetInstance<IDataService>()) 
     { 
      service.Save(this); 
     } 
    } 
} 

Und Nutzung wäre:

Product p = new Product(); 
p.Code = "A1"; 
p.Save(); 

Mit separatem "Kontext"

class Product 
{ 
    private IContext context; 

    public Product(IContext context) 
    { 
     this.context = context; 
    } 

    public string Code { get; set; } 

    public void Save() 
    { 
     this.context.Save(this); 
    } 
} 

Und Nutzung wäre:

using (IContext context = IoC.GetInstance<IContext>()) 
{ 
    Product p = new Product(context); 
    p.Code = "A1"; 
    p.Save(); 
} 

Dies alles geschieht auf BL-Ebene (mit Ausnahme von Anwendungsbeispielen), nichts mit Datenbank usw. zu tun. IDataService ist eine Schnittstelle zur Datenschicht, um Geschäftsobjekte "irgendwo" zu speichern. IContext wickelt IDataService im Grunde irgendwie ab. Tatsächliche Geschäftsobjekte sind komplexer mit mehr Eigenschaften und Referenzen zueinander (wie Auftrag -> OrderRow < - Produkt).

Meine Meinung ist, dass der erste Ansatz (zu) einfach ist und die zweite Wahl gibt mehr Kontrolle außerhalb einzelner Geschäftsobjektinstanz ....? Gibt es Richtlinien für so etwas?

Antwort

3

Ich persönlich entscheide mich für eine dritte Version, bei der das Objekt selbst nicht wissen kann, wie es sich selbst speichert, sondern stattdessen auf eine andere Komponente angewiesen ist, um es zu speichern. Dies wird interessant, wenn es mehrere Möglichkeiten gibt, ein Objekt zu speichern, zB Speichern in einer Datenbank, einem JSON-Stream oder einem XML-Stream. Solche Objekte werden üblicherweise als Serialisierer bezeichnet.

Also in Ihrem Fall würde ich für so einfach wie gehen:

class Product 
{ 
    public string Code { get; set; } 
} 

ein serialize für IContext Serialisierung würde:

class ContextSerializer 
{ 
    public void SaveProduct(Product prod) 
    { 
     using(IContext context = IoC.GetInstance<IContext>()) 
     { 
      context.Save(prod); 
     } 
    } 
} 

Nutzung wäre:

public void SaveNewProduct(string code) 
{ 
    var prod = new Product() { Code = code }; 
    var contextSerializer = new ContextSerialzer(); 
    contextSerializer.SaveProduct(prod); 
} 

Dadurch wird verhindert, dass das Objekt den Kontext (das Feld in Ihrem Beispiel) festhält und Ihre Geschäftsobjekte si bleiben mple. Es trennt auch Sorgen.

Wenn Sie in die Situation kommen, in der Sie Vererbung in Ihren Geschäftsobjekten haben, betrachten Sie die Visitor Pattern.

+0

Wenn ich Lazy Laden mit verwandten Business-Objekten verwenden möchte (Like Produkt hat Liste der Teile), ist dies keine Option, denke ich? Nein, ich habe lazy loading implementiert im Zusammenhang mit dem Kontextfeld .... – Harza

+0

Ich habe auch dies markiert, weil ich auch Pläne habe, Objekte auf verschiedene Arten zu persistieren und dies scheint sehr gute Wahl zu sein, aber diese faulen Laden .... – Harza

+0

I Ich kenne keinen generischen Ansatz für Lazy Loading, es hängt wirklich von Ihrem Anwendungsfall ab. –