Frage

Ich habe eine einfache Desktop-Anwendung in C# 3.0 erstellt, um etwas C#, WPF und .Net 3.5 zu lernen.Meine Anwendung liest im Wesentlichen Daten aus einer CSV-Datei und speichert sie in einer SQL Server CE-Datenbank.Ich verwende sqlmetal, um den ORM-Code für die Datenbank zu generieren.Meine erste Version dieser App ist höllisch hässlich und ich bin gerade dabei, sie umzugestalten.

Das bringt mich zu meiner Frage.Wie würden Sie eine Desktop-Datenbank-App in C# entwerfen?Was sind die Best Practices?

Erstellen Sie einen Database Abstraction Layer (DAL), der den von sqlmetal generierten Code verwendet?Oder reicht der generierte Code als Abstraktion aus?

Wenn Sie das DAL-Muster verwenden, machen Sie daraus einen Singleton oder ein statisches Mitglied?Verwenden Sie das View-Model-ModelView-Muster mit dem DAL-Muster?

Es tut mir leid, wenn dies wie eine lange, offene Frage erscheint, aber ich habe in letzter Zeit viel darüber nachgedacht.Ich sehe viele Beispiele für die Architektur einer N-Tier-Unternehmensanwendung in C#, aber nicht so viele für die Architektur eigenständiger Desktop-Anwendungen.

War es hilfreich?

Lösung

Ich würde mit dem beginnen Leitfaden für zusammengesetzte Anwendungen für WPF (Husten PRISMA Husten) vom P&P-Team von Microsoft.Mit dem Download erhalten Sie eine großartige Referenzanwendung, die den Ausgangspunkt für die meisten meiner heutigen WPF-Entwicklungen bildet.

Der DotNetRocks-Crew gerade interviewt Glenn Block Und Brian Noyes darüber, wenn Sie daran interessiert sind, mehr von ihnen zu hören.

Noch besser ist, dass Prism bei weitem nicht so schwer ist wie das CAB, sofern Sie das aus der Zeit von WinForms überhaupt kennen.

Andere Tipps

Die Antwort lautet wie immer „es kommt darauf an“.

Ein paar Dinge, über die Sie nachdenken sollten:Vielleicht möchten Sie diese Fat-Client-App irgendwann (zum Beispiel) in eine Web-App umwandeln.Wenn ja, sollten Sie darauf achten, die Trennung zwischen der Business-Schicht (und darunter) und der Präsentation einzuhalten.Der einfachste Weg, dies zu tun, besteht darin, sicherzustellen, dass alle Aufrufe der Geschäftslogik über eine Schnittstelle erfolgen.Eine komplexere Möglichkeit besteht darin, ein vollständiges MVC-Setup zu implementieren.

Sie können auch darüber nachdenken, die Datenzugriffsschicht unabhängig von der Geschäftslogik und der Benutzeroberfläche zu machen.Damit meine ich, dass alle Aufrufe von der Geschäftslogik in die DAL generisch sein sollten: „Hol mir diese Daten“, und nicht „Hol mir diese Daten von SQL“ oder noch schlimmer: „Führe diese SQL-Anweisung aus“.Auf diese Weise können Sie Ihre DAL durch eine ersetzen, die auf eine andere Datenbank, XML-Dateien oder sogar etwas Kompliziertes wie Flatfiles zugreift.

Kurz gesagt: Trennung der Belange.Dadurch können Sie in Zukunft wachsen, indem Sie eine andere Benutzeroberfläche hinzufügen, alle drei Bereiche in eine eigene Ebene segmentieren oder die relevante Technologie ändern.

Bevor Sie etwas entwerfen, sollten Sie Anforderungen für Ihre App definieren.
Es ist ein häufiger Fehler von Anfängerentwicklern, mit dem Schreiben von Code zu beginnen, ohne darüber nachzudenken, wie er funktionieren würde.Mein Rat wird sein, zu versuchen, einige Funktionen Ihrer Anwendung zu beschreiben.Es wird Ihnen helfen, zu spüren, wie es umgesetzt werden sollte.

Was nützliche Lernressourcen angeht, würde ich Ihnen wärmstens empfehlen, einen Blick darauf zu werfen CompositeWPF Es handelt sich um ein Projekt, das speziell darauf ausgelegt ist, Entwicklern Best Practices für die Entwicklung von Desktop-Apps beizubringen.

Ich würde mit Jeremy Millers beginnen Bauen Sie Ihr eigenes Fahrerhaus Serie.

Ich war einer der ersten CAB-Anwender.Ich habe viel gelernt, indem ich mich mit dieser Technologie beschäftigt habe und alle .NET-Blogs über Anwendungsarchitektur gelesen habe.

Aber vor kurzem hatte ich die Gelegenheit, ein neues Projekt zu starten, und statt CAB zu verwenden, habe ich mich für StructureMap und NHibernate entschieden und mir einige der Muster ausgeliehen, die Jeremy verwendet (insbesondere seine Art, mit der Ereignisaggregation umzugehen).Das Ergebnis war ein wirklich vereinfachtes, handgefertigtes Framework, das alles kann, was ich brauche, und ich liebe es, damit zu arbeiten.

Zu den Einzelheiten Ihrer Frage:Ich verwende ein Repository für den Datenzugriff.Ich habe zunächst ADO.NET-Code geschrieben, Datenleser verwendet und meine Objekte zugeordnet.Aber das wurde sehr schnell langweilig, also schnappte ich mir NHibernate und war wirklich zufrieden.Die Repositorys verwenden NHibernate für den Datenzugriff, und meine Anforderungen an den Datenzugriff sind in dieser speziellen App ziemlich einfach.

Ich habe eine Serviceschicht (bereitgestellt über WCF, Duplex-Kanäle), die die Repositorys nutzt.Meine App ist im Grunde eine Client-Server-App mit Echtzeitaktualisierung (und ich weiß, dass es bei Ihrer Frage nur um Clients ging, aber ich würde dieselben Technologien und Muster verwenden).Ö

Auf der Clientseite verwende ich MVP mit StructureMap für IoC und einige sehr einfache Ereignisaggregationsstrategien für die klassenübergreifende Kommunikation.Ich programmiere Schnittstellen für fast alles.Das Einzige, was ich sonst noch gemacht habe, war, vom CAB die Idee eines flexiblen „Arbeitsbereichs“ für die dynamische Anzeige von Ansichten zu übernehmen.Ich habe jedoch meine eigene Workspace-Oberfläche geschrieben und meinen eigenen DeckWorkspace und TableWorkspace zur Verwendung in meiner App implementiert (das waren wirklich einfach zu schreibende Dinge).

Viele meiner Entscheidungen in dieser neuesten Anwendung waren das Ergebnis von Erfahrungen und Schmerzen, die ich bei der Verwendung anderer Frameworks und Tools verspürte.Diesmal habe ich andere Entscheidungen getroffen.Der einzige Weg, wirklich zu verstehen, wie man eine Anwendung erstellt, besteht vielleicht darin, vorher zu spüren, wie schmerzhaft es ist, etwas falsch zu machen.

Ich würde sagen: Ja, es könnte leicht auf kleinere Anwendungen hin strukturiert werden.Der Einstieg erfordert eine Lernkurve, aber ehrlich gesagt hat es mir geholfen, WPF besser zu verstehen, als wenn ich versuchen würde, bei Null anzufangen.Nachdem ich ein Projekt mit CompositeWPF gestartet und dann ein anderes Projekt ohne begonnen hatte, versuchte ich, die Funktionen von CompositeWPF selbst zu duplizieren, weil mir diese Funktionen fehlten!:) :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top