Laden...

Technologiewahl für Projektportierung

Erstellt von -Hades- vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.558 Views
-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 7 Jahren
Technologiewahl für Projektportierung

verwendetes Datenbanksystem: MySQL

Hallo zusammen,

ich möchte in der nächsten Zeit ein ERP-System modernisieren. Zur Zeit verwende ich MySQL-Datenbanken (mit der MySQL-Workbench erstellt), welche ich in strong typed datasets übersetzen lasse, zusammen mit Winforms. Die Datenbank besteht aus über 100 Tabellen und ist mittlerweile relativ komplex.
Die grafische Ansicht lässt leider etwas zu wünschen übrig und deshalb möchte ich anfangen das ganze zu WPF zu "portieren". Im Zuge dessen wäre es wahrscheinlich ratsam die strong typed datasets durch etwas zeitgemäßeres zu ersetzen.
Die Frage ist jetzt welche Technologien würdet ihr mir empfehlen? Klar, zu WPF scheint es ja keine Alternative zu geben (gibt es eigentlich sowas wie einen open source store für vorgefertigte WPF-Elemente die schon schick aussehen, vor allem um datengebundene elemente anzuzeigen?) aber vor allem für die Daten wäre es wichtig zu wissen was es gibt und was eurer Meinung nach Sinn macht. Also vor allem welche OR-Mapper taugen was und was sind die Schwachstellen. Die meisten Artikel die ich so gefunden habe sind höchstwahrscheinlich recht gut, allerdings auch schon sehr alt und deshalb die Frage hier nochmal um ganz aktuelle Erfahrungen zu hören.

Beste Grüße
-Hades-

16.806 Beiträge seit 2008
vor 7 Jahren

Alle ORM taugen was. Sie haben aber ihre Schwerpunkte und spezifische Nachteile.
Deswegen pauschal was zu verteufeln oder zu loben ist hinfällig.

W
872 Beiträge seit 2005
vor 7 Jahren

Für das WPF Design würde ich Dir mahapps und dragablz empfehlen - das sind sehr schöne GUI Kits, um eine moderne Oberfläche zu erstellen.

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 7 Jahren

Danke soweit für die Antworten,

mit der GUI ist ja schjonmal super!

Also mit dem ORM ist etwas schwierig für mich zu spezifizieren auf was es ankommt. Ich kannte zum Zeitpunkt der Erstellung nichts anderes und es funktionierte halt. Was ich sagen kann ist, das die Datenbank halt recht groß ist. Der erzeugte Code z.B. ist dermaßen lang, dass es in der Praxis zu heftigen Performance-Einbußen kommt wenn ich beispielsweise den Resharper nutze. Selbst wenn ich die betreffenden Dateien aus dem Resharper-Scan rausnehme ist es schwer flüssig zu arbeiten da er die Dateien halt doch durchsucht wenn ich auf den Typ einer Zeile oder dergleichen zugreife. Aber höchstwahrscheinlich wird da auch kein OR-Mapper abhilfe schaffen oder?

Vielleicht noch etwas zur Vorgehensweise meiner Anwendung. Die Datenbanken sind im Moment auf Microsoft Azure-Maschinen abgelegt. Beim Start der Anwendung lade ich fast alles lokal in die Datasets um darauf dann zu arbeiten und jeweils neue Daten direkt zu committen. Dieses naive Vorgehen habe ich aus Geschwindigkeitsgründen gewählt. Permanent vom Server zu laden ist einfach zu langsam da ich viele Ansichten habe die fast alle Prozesse eines Unternehmens anzeigen müssen, beispielsweise alle Ausgangsrechnungen eines Jahres.
Vielleicht helfen die Beschreibungen noch etwas für die Wahl eines OR-Mapper oder vielleicht weiß jemand generell bessere Vorgehensweisen mit meinen Daten umzugehen. Im Moment ist die Anwendung auch nicht mehrplatzfähig um Inkosistenzen zu vermeiden, das muss in Zukunft auch geändert werden.

16.806 Beiträge seit 2008
vor 7 Jahren

Naja, blind irgendwelche auto-generierten Code, egal ob ReSharper oder was anderes, zu nutzen ist nie gut.
Ich denke, dass es jedenfalls auch hier blind passiert ist.

Für mich hört sich das an, dass ihr euch beim Code verlaufen habt, besonders die Sache mit dem lokalen Laden der Daten, und damit ohnehin eine vollständige Neuentwicklung vermutlich schneller und günstiger ist als das zu reparieren, nicht?

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 7 Jahren

Hmm ich verstehe nicht was du meinst. Natürlich nutze ich den generierten Code, dafür wurde er ja generiert und natürlich verlasse ich mich darauf das er funktioniert. Ich habe die Klassen höchstens an einigen Stellen erweitert, um einfach mehr Comfort bei den Abfragen zu haben.

Ich denke nicht das wir uns verlaufen haben. Die Anwendung funktioniert und ist auch bei Unternehmen im Einsatz. Das mit dem Laden der Daten auf den lokalen Rechner ist natürlich extrem unschön aber ich habe ja gesagt warum ich das getan habe. Ich bin froh über jeden Kommentar, wie würde ich das Laden der Daten denn anders behandeln können ohne das die Anwendung spürbar bei jeder Ansicht auf den Server warten muss?

Es geht auch nicht darum etwas zu reparieren. Ich habe eine zugrundeliegende MySQL-Datenbank, mehr erstmal nicht. Die Controls muss ich ja ohnehin neu erstellen und ich möchte einen neuen OR-Mapper nutzen. Das kommt einer Neuentwicklung ja schon recht nahe. Einzig die Controllerklassen können natürlich bleiben.

Edit: Der Resharper hat natürlich keinen Code generiert, er dient nur als intelligentes Auto-Vervollständigungstool beim Entwickeln.

W
872 Beiträge seit 2005
vor 7 Jahren

Kapsle alle Zugriffe auf die Datenbank in einem eigenen Service.
Würde nicht bei einem Neu-Design die WPF-App mit der Datenbank sprechen lassen.
Wenn Du performante Serialisierung wie Protocol Buffers nimmst, dann hast Du kein Performance Problem - einen schönen Benchmark findest Du hier.

16.806 Beiträge seit 2008
vor 7 Jahren

weismat sagte es schon: kommunizier nicht direkt mit der Datenbank. Sowas macht man bei i.d.R. bei Client-Server-Infrastrukturen nicht mehr.
Hat einfach viel zuviele Nachteile. Die Vorteile rechtfertigen das nicht.

Lass den Service mit der Datenbank kommunizieren, und dieser gibt die Daten via standardisierte JSON (wenn möglich mit OData) Schnittstelle an die Clients weiter.
Das macht alles viel einfacher in der Planung, Wartung, Umsetzung, Weiterentwicklung.

Der Resharper hat natürlich keinen Code generiert, er dient nur als intelligentes Auto-Vervollständigungstool beim Entwickeln.

Auch mit den Vorschlägen des ReSharpers und Auto-Vervollständigung muss man vorsichtig sein (zB. die Vorschläge Schleifen immer in Linq Code umsetzen zu müssen, was manchmal sogar kontraproduktiv ist).
Ich hab das meiste bei ReSharper aus, weil es einfach nicht produktiv ist. Meine Meinung.

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 7 Jahren

Ah interessant. Das heißt der Service würde direkt auf der Azure-Maschine laufen und mittels Protocol-Buffer mit der WPF-Anwendung kommunizieren? Und dieser buffer wäre sowas wie ein Stream an den ich beispielsweise eine neue Klasseninstanz schicke (sagen wir mal eine neu aufgenommene Eingangsrechnung eines Unternehmenes) und der service schickt das an das DBMS? Und welche Rolle spielen da dann die OR-Mapper, also wie kann ich mir das mit der Datenstruktur zwischen DBMS, Service und WPF-Anwendung vorstellen?

Edit: Ja die Übersetzung in LINQ-ausdrücke finde ich auch nicht gut, vor allem weil es viel schwerer zu lesen ist.

16.806 Beiträge seit 2008
vor 7 Jahren

Du hast eine WebAPI basierend auf REST, die die Daten je nach Request von der DB holt (und nur die Daten, die Du wirklich brauchst).
Der Client spricht dann mit dieser WebAPI.

Ich würde nicht sofort Protobuf implementieren, sondern nur, wenn Du dann noch wirklich Performanceprobleme hast.
Schau Dir REST bitte an. Mit Streams arbeitet hier keiner.
Den ORM brauchst Du nur für das Lesen der Daten im Service. Für den Client gibt es keinen ORM, sondern nur eine Serviceimplementierung für die REST-WebAPI.

Linq an für sich ist gut.
Aber nicht wenn der produzierte Code viel schlechter für die Ausführung ist.

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 7 Jahren

Hmm ok und gibt es auch Tools die die Strukturen die zwischen Service und WPF-Anwendung ausgetauscht werden in Klassen umwandelt? Also wenn du sagst ich nutze den ORMapper im Service, gut kann ich mir vorstellen. Dann werden die Daten in JSON-Format umgewandelt, warum macht man das? Weil es ein Standard ist?? Und wie gesagt, wie gehe ich dann mit den XML-Daten in der WPF-Anwendung um, sprich ich möchte ja diese Daten an Datagrids usw. binden und natürlich auch generierte Methoden nutzen können um zum Beispiel relationell bezogene Daten zu einem Objekt (Buchungssätze zu einer Rechnung) abrufen zu können. Halt all das was der ORMapper sonst generiert hätte.

16.806 Beiträge seit 2008
vor 7 Jahren

Wie gesagt, bitte investier wenigstens eine Stunde in REST, damit Du weisst, warum wir das empfehlen.
Dann entstehen Fragen wie das Warum nicht. Ich hab dazu vor einiger Zeit gebloggt mit dem Ziel, dass es Leute lesen 😃
Eine moderne WebAPI – die OData Basics

Aus Clientsicht rufst Du die Daten nicht über die DB ab, sondern über einen Service.
Wenn Du Dich an [Artikel] Drei-Schichten-Architektur hälst, dann erfolgt der Austausch einfach.
Eine UI sollte nicht wissen, ob sie die Daten aus einer DB bekommen oder von einem Service.
Ist das der Fall, ist das ein Fehldesign.

Das sind jetzt aber mehr oder minder Grundlagen zu einem sauberen Applikationsdesign.
Die sollte man für die Planung einer Client-Server-Anwendung aber absolut haben und aus dem FF kennen.

-
-Hades- Themenstarter:in
171 Beiträge seit 2007
vor 7 Jahren

Ja MVC ist klar, mir ging es um die empfangenen Daten selber. Diese liegen ja im Moment bei mir in Form von datasets vor. Mit dem neuen Design würden das ja JSON-formatierte Daten sein wenn ichs richtig verstanden habe. Werden diese Daten auch direkt als Datasource von beispielsweise datagrids verstanden und können direkt gebunden werden oder muss ich da dan noch selber Hand anlegen und dann nochmal Strukturen draus aufbauen?

Edit: Und sorry, ich werde gewiss weit mehr als nur eine Stunde investieren aber ich finde das hier eine sehr gute Möglichkeit um ein Gefühl für den Umfang der Portierung und generell der Möglichkeiten zu bekommen.

16.806 Beiträge seit 2008
vor 7 Jahren

Niemand hat von MVC gesprochen. MVC sehe ich hier auch gar nicht.....
WebAPI ist nicht (direkt) MVC. MVC hat ein anderes Ziel.

Und nochmal: Du hast typisierte Objekte, dann in Form von Json zum Datenaustausch.
Dementsprechend bindest Du auch Collections von Objekten. Kein Wort von einem DataSet. =)