Wie strukturiere ich mehrere überlappende Lösungen / Projekte in .Net?

16

Ich habe vor kurzem angefangen, für einen neuen Client mit einer alten Codebasis zu arbeiten, in der es mehrere .net-Lösungen gibt. Jede hostet normalerweise einige Projekte, die für diese Lösung spezifisch sind, aber dann "leihen" / "verknüpfen" (bestehendes Projekt hinzufügen) einige andere Projekte was technisch zu anderen Lösungen gehört (zumindest wenn man sich an die Ordnerstruktur in TFS hält)

Ich habe noch nie ein derart verflochtenes Setup gesehen, es gibt keine eindeutige Erstellungsreihenfolge, manchmal verweist ein Projekt in Lösung A direkt auf DLLs aus dem Ausgabeverzeichnis eines Projekts in Lösung B, manchmal wurde das Projekt auch dann direkt aufgenommen, wenn es sich befindet Weit weg in der Ordnerstruktur.

Es sieht so aus, als ob alles für die Faulheit der Entwickler optimiert wurde.

Als ich sie mit der Frage konfrontierte, warum sie keinen CI-Server hatten, antworteten sie, dass es schwierig sei, den Code so einzurichten, wie er ist. (Ich richte es jetzt ein und verfluche diese Code-Organisation)

Die Lösungen sind nach Bereitstellungsartefakten organisiert (Dinge, die zusammen bereitgestellt werden müssen, befinden sich in derselben Lösung). Ich halte dies für eine kluge Entscheidung, aber der Inhalt dieser Lösungen (der Projekte) ist allgegenwärtig.

Besteht ein Konsens über eine bewährte Methode für die Wiederverwendung gemeinsamer Klassenbibliotheken für mehrere Lösungen / Bereitstellungsartefakte?

  • So strukturieren Sie Code im VCS
  • Erleichterung der gemeinsamen Nutzung von Geschäftslogik zwischen verschiedenen Bereitstellungsartefakten
Andreas Knudsen
quelle

Antworten:

9

Ich war noch nie ein Fan von bestehenden Projekten, die zu anderen Lösungen gehören. Es gibt zu viele Variablen, bei denen eine Bearbeitung dieses Projekts für 1 Lösung etwas in einer anderen Lösung völlig kaputt macht. Wenn Sie dieses Problem beheben, brechen Sie letztendlich die ursprüngliche Lösung. Aufschäumen, ausspülen, wiederholen.

Wenn diese Art von Abhängigkeit in mehrere Lösungen mündet, möchte ich den abhängigen Code in seine EIGENE Lösung aufteilen und eine Black-Box-Bibliothek erstellen, die dann als Referenz enthalten ist. Meiner Meinung nach waren Ihre Lösungen so miteinander verknüpft, dass das Debuggen für jede Lösung bis in das gemeinsame Projekt hinein durchgeführt werden konnte. Wenn die Bibliothek ordnungsgemäß erstellt und getestet wurde, ist diese Art des Debuggens wirklich nicht erforderlich. Die Bibliothek sollte in der Lage sein, für sich selbst zu bestehen, und sollte gründlich getestet werden, damit die Erwartungen eines Verbraucherprojekts konsequent erfüllt werden.

Joel Etherton
quelle
3
Darüber hinaus ist Refactoring so leicht in diesen Tagen, so dass , wenn Sie tun das Gefühl , dass einige Sporn-of-the-Moment wichtig genug , um Veränderung in der Bibliothek zu machen , ist selbst, können Sie es Projekt Ihre Anwendung kann jetzt und in die Bibliothek fusionieren später , wenn Sie von Ihrer aktuellen Aufgabe weniger abgelenkt sind und Zeit haben, geeignete Tests durchzuführen.
Aaronaught
@Aaronaught: +1 dazu.
Joel Etherton
5

Ich habe solche TFS-Strukturen wie die von Ihnen erwähnte organisiert und obwohl sie CI vor einzigartige Herausforderungen stellen, haben sie eine Reihe von Vorteilen. Eines ist klar: Es unterstützt und fördert die ordnungsgemäße Komponentisierung in separaten .NET-Projekten und unterstützt somit eine gute TDD, indem es eine 100% ige Testabdeckung fördert. Gleich nach dem Start stelle ich ein paar Probleme fest, die Sie angehen können.

Manchmal verweist ein Projekt in Lösung A direkt auf DLLs aus dem Ausgabeverzeichnis eines Projekts, das in Lösung B gehostet wird. Manchmal wurde das Projekt auch dann direkt einbezogen, wenn es sich weit entfernt in der Ordnerstruktur befindet.

Binäre Verweise auf die Ausgabe anderer Verzeichnisse sind kein guter Ansatz und werden zu einem schlechten Ansatz, wenn sie auch mit Projektverweisen vermischt werden. Versuchen Sie, das eine oder andere zu tun, und ändern Sie Ihre Binärreferenzen vorzugsweise zumindest aus Gründen der Konsistenz in Projektreferenzen. Zu diesem Zeitpunkt kann jede Lösung eine einzelne erstellbare Anwendung oder Anwendungsebene darstellen (z. B. SuperApp.sln, OtherAppServices.sln, OtherAppPresentationTier.sln).

Um ALLE Projekte zu erstellen, empfehle ich, auch eine Master-Lösung zu erstellen. Die Master-Lösung verfügt über Projektverweise auf alles und ist im Wesentlichen nur zum Vorteil eines einzigen Build-Befehls vorhanden, der alle Projekte in der Anwendungssuite verarbeitet. Entwickler sollten die Master-Lösung nicht für die aktive Entwicklung oder das Debuggen verwenden. Dies erleichtert das Zusammensetzen der Build-Artefakte erheblich.

Die Bereitstellung kann dann mit einem einfachen Batch-, Powershell- oder Perl-Skript erfolgen. Dadurch wird im Wesentlichen die entsprechende Lösung oder die Master-Lösung erstellt und anschließend alles in den entsprechenden Umgebungen bereitgestellt. Dies kann leicht in jeden CI-Server integriert werden, wenn es richtig gemacht wird.

• Erleichterung der gemeinsamen Nutzung von Geschäftslogik zwischen verschiedenen Bereitstellungsartefakten

Erstellen Sie ein Projekt für die allgemeine Geschäftslogik, oder lösen Sie die Probleme für eine globalere oder universellere Geschäftslogik besser auf. Alle implementierbaren Lösungen, die darauf verweisen möchten, sollten dies durch eine Projektreferenz tun.

Wenn Sie Ihren Code in TFS organisieren, können Sie dies einfacher erreichen, indem Sie gemeinsame oder gemeinsam genutzte Projekte in der Verzeichnisstruktur auf einer höheren Ebene speichern.

maple_shaft
quelle