Was ist der gemeinsame Weg für OOP Musterentwurfs- (Data Access)
-
02-07-2019 - |
Frage
Am Anfang war das DAL-Objekt, das ist meine BO für info genannt und dann zu UI weitergegeben. Dann begann ich, reduziert Code in UI zu merken und es gab Controller-Klassen. Was ist die anständige recomendation.
ich derzeit Struktur Mine
Public Class OrderDAL
Private _id Integer
Private _order as Order
Public Function GetOrder(id as Integer) as Order
...return Order
End Function
End Class
dann habe ich Controller-Klassen (vor kurzem implementiert diese Art)
Public Class OrderController
Private Shared _orderDAL as new OrderDAL
Public Shared Function GetOrder(id) As Order
Return _orderDAL.GetOrder(id)
End Function
End Class
Dann in meiner Anwendung
My app Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
msgbox(OrderController.GetOrder(12345).Customer.Name)
End Sub
End app
Ich fand ursprünglich, dass mit der freigegebenen Klasse I nicht eine neue Instanz der DAL zu halten habe zu schaffen, wenn ich Daten müssen holen
Dim _orderDAL as New OrderDal
_orderDAL.GetOrder(1234)
.....
Was ist Ihre Meinung?
Danke
Lösung
Ich habe Ihre Lösung in der Vergangenheit verwendet, und das einzige Problem, das ich konfrontiert ist, dass „Shared“ oder „statisch“ Methoden nicht unterstützen Vererbung. Wenn Ihre Anwendung wächst, können Sie sehr gut brauchen, um verschiedene Arten von „OrderControllers“ zu unterstützen.
Die estabilished Art und Weise unterschiedlichen OrderControllers der Unterstützung wäre in der Theorie, eine Fabrik zu erstellen:
OrderControllerFactory.ConfiguredOrderController().GetOrder(42);
Das Problem hierbei ist: welche Art zurückgegeben wird durch "ConfiguredOrderController ()"? Da es sich um die statische „GetOrder (int id)“ Methode haben muss - und statische Methoden sind nicht durch Vererbung oder Schnittstellen unterstützt. Die Art und Weise, um dies ist nicht statische Methoden in der OrderController Klasse zu verwenden.
public interface IOrderController
{
Order GetOrder(int Id)
}
public class OrderController: IOrderController
{
public Order GetOrder(int Id)
{}
}
und
public class OrderControllerFactory()
{
public IOrderController ConfiguredOrderController()
{}
}
Daher werden Sie wahrscheinlich besser dran, durch die Verwendung nicht-statische Methoden für die Steuerung.
Andere Tipps
Ich denke, es gibt mehrere Alternativen in diesem ausgezeichneten Buch aufgeführt: Patterns of Enterprise Application Architecture . Einige Muster, die für Sie von Interesse sein können:
Nun Ihre Anwendung sollte nicht separate Versionen der Daten werden Instanziieren acces Schicht, so dass man unter Kontrolle, dass haben. Der Pseudo-Code Sie auf dem Laufenden ist wirklich schwer allerdings zu lesen.
Die Frage ist, was Ihre Datenzugriffsschicht ist, und wie viel ist es? Das wird ein gutes Stück diktieren, was Sie tun. Wenn Ihr persiting in eine Datei dann denke ich, was Sie geschrieben haben, ist in Ordnung, und wenn man es mit anderen Controllern in Ihrem System austauschen müssen, dann ist es möglich, die Artikel in einem Singelton (Schauder) zu wickeln.
Wenn Sie wirklich Auftragsbearbeitung tun und zurück in eine Datenbank persistierenden, ich denke personaly es Zeit ist, zu einem ORM zu suchen. Diese Pakete werden die CRUM Aspekte für Sie erledigen und die Anzahl der Elemente reduzieren, die Sie haben zu halten.
My $ .02, und ich behalte mir das Recht vor, meine Antwort zu überarbeiten, sobald ich ein besseres Beispiel zu sehen.
Ich kann nicht auf die VB Details sprechen, weil ich keinen VB-Entwickler bin, aber:
Was Sie tun, ist eine gut etablierte gute Praxis, die GUI / Präsentationsschicht aus der Datenschicht zu trennen. Einschließlich realen Anwendungscode in GUI Ereignismethoden ist eine (leider auch gut etablierte) schlechte Praxis.
Ihre Controller-Klasse ähnelt die Brückenmuster rel="nofollow die ist auch eine gute Idee, wenn beide Schichten werden Lage sein, ihre Form zu ändern, ohne die andere darüber wissen.
Gehen Sie weiter!
Es ist eine gute Praxis - vor allem, wenn Sie zu einem Punkt, wo der Controller benötigt mehr als eine einfache Übertragung auf das darunter liegende DAL zu tun.