Visual Studio, Git e codice comune

7

Sto cercando alcuni consigli su come dovrei organizzare un nuovo grande progetto su cui sto lavorando per consentirmi di gestirlo più facilmente in Git (usando GitLab) e sviluppato in Visual Studio.

Per dare un'idea di scala, questo è un intero backend del server che consisterà in alcuni servizi di rete (socket), servizi di elaborazione dati e servizi web. Ognuno di questi servizi sarà un progetto individuale, ma ci sarà un sacco di codice comune che voglio separare e tra loro (cioè gli assembly condivisi).

Quindi diciamo che ho i seguenti progetti di Visual Studio, con le dipendenze mostrate:

Utility
SharedSocketCode - [ Utility ]
SocketServiceA - [ SharedSocketCode ]
SocketServiceA.WindowsServiceHost - [ SocketServiceA ]
SocketServiceA.ConsoleHost - [ SocketServiceA ]
SocketServiceB - [ SharedSocketCode ]
SocketServiceB.WindowsServiceHost - [ SocketServiceB ]
SocketServiceB.ConsoleHost - [ SocketServiceB ]
DbEntityModel
DataLogServiceA - [ DbEntityModel, Utility ]
DataLogServiceB - [ DbEntityModel ]
SharedWebServiceCode
WebServiceA - [ SharedWebServiceCode, DbEntityModel ]
WebServiceB - [ SharedWebServiceCode, DbEntityModel ]

Come puoi vedere, ci sarà un sacco di codice condiviso, e questa è solo la punta dell'iceberg! Sono combattuto tra l'archiviazione di tutto questo nello stesso repository, o cercando di dividerli in singoli.

Il primo sembra più facile da gestire in quanto non dovrò lottare con Visual Studio alla ricerca di codice condiviso in quelle che potrebbero essere posizioni diverse sulla versione locale di ciascun utente - i progetti verranno tutti memorizzati in modo prevedibile a livello di soluzione.

Quest'ultimo suona come mi darà più controllo sulla versione di ogni componente e separando logicamente quello che altrimenti sarebbe un singolo codice base di mammoth.

Sono abbastanza nuovo per Git e GitLab, quindi non sono sicuro se c'è qualcosa che può aiutare con questo tipo di scenario. Qualsiasi consiglio sarebbe benvenuto.

(FYI, ho aggiunto il tag GitHub perché ritengo che sia ragionevolmente simile a GitLab, quindi potrebbe esserci qualche assistenza che posso ottenere dai suoi utenti)

    
posta Barguast 20.02.2015 - 12:34
fonte

1 risposta

1

Penso che tu stia andando alla grande dividendo il tuo Solution di Visual Studio in diversi Projects che stanno creando librerie, come hai detto tu e @antlersoft nel commento.

In questo modo puoi avere diversi altri Solutions o anche progetti che creano un file binario standalone (come exe della riga di comando) che fa riferimento a queste librerie (Solution Explorer: aggiungi riferimento).

L'unica cosa che git o Visual Studio non sta facendo per te (come l'architetto del software di una o più soluzioni) è di sbrogliare i riferimenti avanti e indietro tra il tuo modules (io uso questo anche per la libreria qui).

È una buona idea avere un'architettura a strati in ogni sistema software più grande. Quando esegui la re-architettura dell'intero sistema, puoi seguire queste best practice:

  • crea uno spazio dei nomi per ogni libreria che si diffonde attraverso tutti i file sorgente in questa libreria
  • verifica l'utilizzo: quale file .cs (e quindi il suo spazio dei nomi e la libreria che è compilata come progetto separato) usa la classe (es) in questa libreria
  • assegna ogni spazio dei nomi / libreria a un livello (non devi dare nomi ai livelli); puoi farlo su carta o utilizzare uno strumento UML che supporti i diagrammi dei componenti (incluso quello nelle versioni di Visual Studio con valori più alti, alcuni strumenti UML chiamano esplicitamente il diagramma di livello)

Alla fine della giornata, si ottiene una buona architettura se nessuna libreria di un certo livello utilizza alcuna libreria in un livello superiore (senza frecce rivolte verso l'alto) o lo stesso livello (frecce di puntamento laterali). Se non riesci a farlo facilmente, puoi scegliere la forma più debole di consentire l'accesso allo stesso livello.

{Se scarichi la versione di anteprima di Visual Studio "15" (che è un VS finale, finché è ancora disponibile) puoi aprire il tuo progetto e scegliere New Diagram dal menu Architecture (a destra a Strumenti), scelto Layer Diagram e gioca un po '- c'è un video how-to collegato dopo aver creato il tuo primo diagramma. La seguente schermata mostra il diagramma generato che si ottiene trascinando in alcune delle tue librerie da Esplora soluzioni, facendo clic con il pulsante destro del mouse su di esso e selezionando Genera dipendenze. }

LayerDiagrampermostrarecomeimplementatoinVisualStudio"15"

I seguenti refactoring ti aiutano ad arrivarci:

  • Sposta un'intera classe in un altro spazio dei nomi / libreria
  • sposta una proprietà / campo su o giù per la gerarchia di ereditarietà per spostare la dipendenza originata dall'accesso a questa proprietà / campo in uno spazio dei nomi diverso
  • sposta un metodo verso l'alto o verso il basso della gerarchia dell'ereditarietà per lo stesso motivo
  • fai qualche classificazione aggiuntiva di a) aggiungendo una superclasse più generale che contiene solo un sottoinsieme di proprietà / campi e / o metodi o b) creando sottoclassi più specifiche

Il processo di re-architecturing o refactoring del tuo sistema per risolvere le dipendenze inter-libreria (pacchetto / spazio dei nomi / modulo) che ti impediscono di riutilizzare il tuo software esistente in ulteriori i progetti hanno prodotto una quantità molto significativa di pubblicazioni. L'ho chiamato untangling sopra il quale non è proprio il termine scientifico. Un riferimento bibliografico eccezionale che copre questo aspetto (ed è stato scritto molto prima dei tempi di git ma è comunque un'ottima fonte) è la Gang-of -Four Book che utilizza il termine design del software (come nell'analisi e nella progettazione orientata agli oggetti). Puoi anche trovare alcuni ottimi libri o articoli utilizzando re-architecturing o solo architecture o refactoring nel tuo negozio di libri o motore di ricerca preferito.

Solo per riconfermarlo: una volta riadattate le linee del progetto in questo modo, ogni progetto è un buon candidato per essere usato anche come repository git e potete verificarlo con qualsiasi numero di soluzioni aggiuntive che volete riutilizzare libreria in.

    
risposta data 12.05.2016 - 19:24
fonte

Leggi altre domande sui tag