Hoffentlich eine einfache Relativitätsfrage. Ich beginne mit der Arbeit an einem neuen internen Projekt, um die Rückverfolgbarkeit reparierter Geräte in den Gebäuden zu gewährleisten.
Die Datenbank wird remote auf einem Webserver gespeichert und über die Web-API (JSON-Ausgabe) aufgerufen und mit OAuth geschützt. Die Front-End-Benutzeroberfläche wird in WPF und der Geschäftscode in C # ausgeführt.
Daraus sehe ich die verschiedenen Ebenen Präsentation / Anwendung / Datenspeicher. Es gibt Code zum Verwalten aller authentifizierten Aufrufe an die API, eine Klasse zum Darstellen von Entitäten (Geschäftsobjekte), Klassen zum Erstellen der Entitäten (Geschäftsobjekte), Teile für die WPF-GUI, Teile der WPF-Ansichtsmodelle usw.
Ist es am besten, dies in einem einzelnen Projekt zu erstellen oder in einzelne Projekte aufzuteilen?
In meinem Herzen sage ich, dass es mehrere Projekte sein sollten. Ich habe es zuvor in beide Richtungen gemacht und festgestellt, dass das Testen mit einer einzelnen Projektlösung einfacher ist. Bei mehreren Projekten können jedoch rekursive Abhängigkeiten auftreten. Besonders wenn Klassen Schnittstellen haben, um das Testen zu vereinfachen, habe ich festgestellt, dass die Dinge unangenehm werden können.
quelle
Antworten:
Dies hängt von der Größe des Projekts ab
Hier sind die Richtlinien, die ich normalerweise verwende
Ein kleines Projekt mit einer Handvoll Seiten oder weniger, ich halte mich fast immer an ein einzelnes Projekt.
Wenn die Datenzugriffsebene des kleinen Projekts groß oder komplex ist, kann ich sie in eine eigene Ebene aufteilen, ansonsten befindet sie sich nur in einem eigenen Ordner.
Wenn das Projekt größer ist, habe ich fast immer ein separates Projekt für die DAL, und jede weitere Aufteilung hängt davon ab, wo die Grenzen zwischen den Funktionen der Anwendung liegen.
Wenn die Anwendung mehrere Zwecke hat, jede mit ihren eigenen Ansichten, Ansichtsmodellen usw., werde ich normalerweise jedes Teil in einen eigenen Bereich unterteilen. Wenn jeder Abschnitt klein ist, trenne ich sie durch einen Ordner. Wenn jeder Abschnitt groß ist, werde ich sie durch ein Projekt trennen.
Wenn ich mehrere Projekte habe, die auf denselben Objektsatz (
ViewModelBase
,RelayCommand
usw.) verweisen müssen, erstelle ich ein Projekt nur für die gemeinsam genutzten Infrastrukturobjekte.Wenn ich eine große Anzahl freigegebener benutzerdefinierter Stile / Vorlagen / Ressourcen habe, erstelle ich ein Projekt nur für diese.
Als Randnotiz habe ich bei meinem ersten großen WPF-Projekt einen Fehler gemacht und sie getrennt, indem ich Modelle in ein Projekt, Ansichten in ein anderes und ViewModels in ein drittes eingefügt habe. Ich kann Ihnen jetzt sagen, dass dies nicht der richtige Weg ist, da die Wartung zum Albtraum wird :)
quelle
SearchView
,SearchViewModel
undSearchResultModel
alle würden in einem Ordner zusammengefasst, und ich habe festgestellt, dass dies die Wartung der App erleichtert.Interface
für die Datenschicht, aber die eigentliche Datenzugriffsschicht für die Suche befindet sich in der DAL-Bibliothek. Sehr oft habe ich eineInfrastructure
oder eineCommon
Bibliothek, die allgemeine Basisklassen, Schnittstellen und Hilfsklassen enthält.Ich habe die besten Ergebnisse mit einem Projekt pro Ebene und einem Testprojekt pro Ebene gesehen. Ich habe nur wenige Anwendungen gesehen, die in 10 oder weniger Projekten in der Lösung nicht ausgeführt werden können, wobei die Lösung alles umfasst .
Fallen Sie nicht in die Falle, Projekte zu verwenden, bei denen Sie wirklich einen Namespace wünschen. Tonnenweise Projekte verursachen nichts als Overhead ohne Gewinn.
quelle
IMHO getrennt ist fast immer besser. Ich trenne meine Datenschicht fast immer ab, es sei denn, das Projekt ist zu 100% trivial. Der Grund dafür ist, dass die Datenschicht am häufigsten herumgereicht wird. In seltenen Fällen schließen Sie eine GUI an mehrere Datenschichten an und erwarten, dass sie gut funktioniert. Das weitaus häufigere Szenario besteht darin, dass Sie über eine einzelne Datenschicht verfügen und diese auf mehrere GUIs (z. B. ASP.Net, WPF und eine Silverlight-App) verteilen möchten. Es ist fantastisch, wenn Sie einfach das Datenschichtprojekt erstellen und diese DLL als Referenz in die nächste von Ihnen erstellte GUI einfügen können.
quelle
Für mich ist 4 * die magische Zahl. Ein Projekt für jede Ebene und ein Projekt, das alle Schnittstellen / DTOs definiert, die für die Kommunikation zwischen ihnen erforderlich sind.
* 7, wenn Sie Unit-Tests zählen
quelle
Ich habe immer eine einzige Lösung verwendet, wenn ich an diesen verschiedenen Schichten arbeite oder wenn eine enge Kopplung mit ihnen besteht. Ich möchte F5 drücken und alle Projekte bei Bedarf neu erstellen lassen. Ich glaube nicht, dass es einen "richtigen" Weg gibt, dies zu tun.
quelle
Sein persönlicher Geschmack, das Wichtigste ist, konsequent zu sein . Ich persönlich habe für jede Schicht der Anwendung ein eigenes Projekt, sodass die Trennung offensichtlich ist.
quelle
Die Zunahme der Anzahl der Projekte hat damit zu tun, dass Unit-Tests aktiviert und das Abhängigkeitsdiagramm so weit vereinfacht werden, dass die Dinge nicht mehr so komplex sind, dass Änderungen in einem Teil der App Dinge in scheinbar nicht verwandten Teilen der App beschädigen.
Es funktioniert, wenn ich eine Art Abhängigkeitsinversion durchführe, um alle "Verträge", Schnittstellen, abstrakten Klassen und Datenübertragungsobjekte in einer Assembly zusammenzufassen. In einer anderen Assembly habe ich alles, was mit der Datenbank spricht, abgelegt. Unit-Tests erhalten eine eigene Baugruppe. Wenn die Benutzeroberfläche grundsätzlich nicht testbar ist (z. B. ASP.NET-Winforms), bietet die Aufteilung der Benutzeroberfläche in testbaren Code und nicht testbaren Code - jeweils eine Assembly - einen erheblichen Vorteil. Manchmal taucht Code auf, der nichts mit der Datenbank, der Benutzeroberfläche oder irgendetwas zu tun hat, was ich bisher erwähnt habe - es ist Code, den ich mir im .NET Framework gewünscht habe. Diesen Code werde ich in eine Utilities-Assembly einfügen oder zumindest in die Root-Assembly (wahrscheinlich die mit den Schnittstellen).
Wenn alle Baugruppen auf alle Baugruppen verweisen oder fast alle, sollten sie wieder zu einer einzigen Baugruppe zusammengeführt werden. Wenn Ihnen oder den Mitarbeitern Ihres Teams die Disziplin fehlt, um zu verhindern, dass Code auf Datenebene in die Benutzeroberfläche und Benutzeroberfläche in die Datenebene eingefügt wird, vereinfachen Sie die Dinge, indem Sie alles wieder in einer einzigen Ebene zusammenführen.
Bei einigen Editionen von Visual Studio treten bei etwa 15 Assemblys Leistungsprobleme auf. Manchmal hängt dies davon ab, welche Art von Projekt vorhanden ist. Das strategische Entladen von Projektdateien kann jedoch manchmal hilfreich sein.
quelle
Der einzige gute Grund, mehr als ein Projekt zu haben, besteht darin, dass Sie eine Reihe von Klassen und Dateien für mehrere Anwendungen freigeben müssen.
Wenn Projekte nur von einer Anwendung verwendet werden, sollten sie gar nicht erst erstellt worden sein. Verwenden Sie stattdessen Namespaces. Sparen Sie sich die Mühe von Zirkelverweisen, DLL-Overhead und Projektverwirrung bei der Suche nach Dateien.
Lesen Sie diesen Artikel, um eine ausführlichere Erklärung zu erhalten, warum dies so ist: http://lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- Lösungsdatei /
Und wie der Artikel besagt, würde ich jeden begrüßen, der einen triftigen Grund hat, mehrere Projekte außer Code-Sharing in der gesamten Anwendung zu haben, um mir zu sagen, was es ist, weil ich bezweifle, dass es eines gibt.
quelle