2016-04-15 12 views
3

Ich versuche, die beste Lösung für ein großes Problem mit der Code-Duplizierung zu finden. Wir haben ein ASP.NET Web Api Backend mit einem Angular Frontend. Unsere Backend-Lösung hat auch mehrere Projekte, die die Business Logic und DAO für den Zugriff auf die Datenbank enthalten.Strategien zur Vermeidung von Code-Duplizierung in Web-Anwendung

Nun, das Problem ist, wir haben mehrere Kunden, jeder hat eine andere Benutzeroberfläche mit manchmal anderen Javascript Code, aber das Backend bleibt gleich. Also, derzeit, für jeden Kunden erstellen wir ein neues Projekt in Visual Studio mit fast allen Client-Seite Code dupliziert wird + die Benutzeroberfläche ändert und auch alle Controllers aus dem Backend dupliziert werden, sowie Dateien wie Global.asax, OWIN Auth, etc .

Dies wird zum Albtraum, es gibt eine Menge Code doppelt und es ist ein Schmerz zu pflegen. Ich habe einige Optionen denken:

  • eine unterschiedliche .js, .css, .html Datei für jeden Kunden, sondern nur für die Dateien, die wir ändern, dann, wenn die Bereitstellung, Visual Studio sagen, welche Datei entsprechend der Konfiguration zu implementieren (I weiß nicht, ob dies möglich ist)
  • ein Tool finden, die uns Code bedingt zu ändern, in der gleichen Art und Weise in Javascript erlaubt Visual Studio tut mit Web.config für die verschiedenen Konfigurationen deploy
  • Suchen Sie nach einer anderen Ansatz/Architektur für den Code?
+0

wäre dies besser für programmers.se geeignet? – jleach

+0

Wenn ein Moderator das denkt, dann zögern Sie nicht nach oben zu gehen :) – Andres

+0

Ich gebe das nicht als Antwort, weil es wirklich schwer zu tun ist und möglicherweise von Ihrem VC-System abhängig ist. Ich teile das Projekt tatsächlich auf, wobei sich der Backend-Code in einem Verzeichnis befindet und der Front-End-Code für jedes Projekt in einem anderen Verzeichnis liegt, mit dem gemeinsamen angularJS-Code in einer git-Unterstruktur. Um ein neues Kundenprojekt zu starten, haben wir [gabel] (http://www.woodcp.com/2014/01/how-to-fork-git-repositories-on-visual-studio-online/) unser Basisprojekt Front-End und verzweigen das Back-End (so können wir Verbindungsstrings und so weiter). Clientspezifische Änderungen gehen außerhalb des Teilbaums im Client-Projekt. –

Antwort

1

Sie können ein Projekt in mehreren Lösungen referenzieren.

Ich würde eine Reihe von gemeinsamen Projekten aufbauen und dann individuelle Kundenprojekte, die die Web-App einbinden und "fertigstellen".

Es wäre wahrscheinlich klug, dieses endgültige Kundenprojekt zu einer Vorlage zu machen, um sicherzustellen, dass nichts übersehen wird.

+0

Es ist nicht so einfach, da. NET im Grunde eine Struktur, wo Ihre Dienste alle mit Ihrem Client-Seite Code und alle pfm verwirrt sind Das heißt, Sie haben keine große Chance zu verstehen, wie alle Abhängigkeiten von den verschiedenen Projekten zusammenhängen, bis die Dinge wirklich hart zusammenbrechen. –

+1

Diese Antwort sagt im Grunde genommen, "eine Produktlinie" auf eine ad hoc Weise zu bauen. Siehe meine Antwort für einen besser organisierten Ansatz. OPs Einwand gegen Abhängigkeiten ist im Wesentlichen richtig; Sie müssen auf eine organisierte Weise erfasst werden, damit die generierten Systeme NICHT brechen. –

1

Was Sie tun müssen, ist Ihre multiple Systeme in eine product line konvertieren.

Eine Produktlinie ist eine Software-Codebasis und ein Konfigurationsmanagement, das von (Produkt-) Merkmalen gesteuert wird [im Fall von OP könnte ein Merkmal ein Kundenname sein]. Die Features geben die spezifischen Eigenschaften einer bestimmten Produktlinieninstanz an. Die Konfigurationsverwaltungstools verwenden die Feature-Spezifikation, um die relevanten Teile der Softwarebasis auszuwählen und sie dem (vollständig freigegebenen) Baseline-Teil des Produkts hinzuzufügen. Ein gutes Feature-Management ermöglicht es einigen Features, andere zu implizieren oder zu leugnen, um das Problem zu minimieren, das richtige Feature-Set für eine Produktlinieninstanz zu erhalten.

Produktlinien sind nicht einfach zu bauen; Aber dann ist es noch schwieriger, einen großen Stapel von Systemen auf eine ad hoc Weise zu verwalten, die ziemlich ähnlich sind.

können Sie Open-Source-Tools wie XVCL [eine Art „bedingte Kompilierung“, die sich über jede Art von Quellcode arbeitet] oder kommerzielle Pakete wie BigLever Produktlinien zu implementieren.

Um von Ihrem aktuellen Status in eine verwaltete Produktlinie zu gelangen, müssen Sie herausfinden, was aktuelle Systeme teilen, wie sie variieren, und ein Vokabular erfinden, um die Varianten als Merkmale zu beschreiben. Sie können das von Hand (schmerzhaft) tun.Sie werden wahrscheinlich besser mit einem (JavaScript-capable) Clone Detector, und konzentrieren sich auf language-specific commonality extraction. Wenn Ihre Software mehrere Arten von Artefakten (HTML, JavaScript, SQL, Build-Skripte, ...), können Sie feststellen, dass eine organized process for discovery of commonality across and within multiple levels (see heading "Refactoring to Product Lines") ist konstruktiv.

Verwandte Themen