Entrambi i metodi hanno i loro vantaggi e svantaggi, e quale è meglio dipende in ultima analisi da molteplici fattori come la dimensione e la composizione della squadra, la configurazione di build e release e ciò che è più conveniente per te.
Molti progetti racchiudono tutto in un'unica soluzione, e per le codebase di piccole e medie dimensioni lavorate da poche persone questo è un approccio perfetto. Avrai la comodità di poter fare facilmente riferimento al codice comune senza fare confusione con feed NuGet privati o riferimenti incrociati, non è necessario passare da un'istanza di Visual Studio se la modifica che stai apportando tocca più soluzioni e il debug è minore di un dolore. A giudicare da Microsoft che si concentra su cose come il carico leggero in VS2017, questo è un caso d'uso piuttosto comune.
Nei progetti più grandi, tuttavia, l'idea di avere un unico repository di codice strettamente associato a tutto e il sink della cucina al suo interno richiede molta comunicazione e sincronizzazione tra gli sviluppatori. Se Team Vendor Backend ha appena cambiato la libreria comune e ha bisogno di rilasciare la versione aggiornata ieri, ma il team Customer Backend inizia a lamentarsi del fatto che ci vorranno un mese per integrare le modifiche, quella singola soluzione diventa un problema.
Puoi basarti sulla disciplina del controllo del codice sorgente e sulla ramificazione appropriata per risolverlo, ma a un certo punto diventa una buona idea dividere il tuo progetto in componenti indipendenti più piccoli - ad esempio, i tuoi metodi di utilità potrebbero diventare un pacchetto NuGet, con un repository e una soluzione separati e uno schema di controllo delle versioni coerente. Quindi Team Vendor Backend può aggiornare il codice più recente nella propria soluzione e Team Backend del cliente può impiegare del tempo a lavorare sull'integrazione del pacchetto più recente e su altre cose che devono fare senza essere trattenuto.
Se lavori da solo e non hai così tanto codice che diventa ingombrante affrontare una singola soluzione, probabilmente è eccessivo. Scambia la convenienza di essere in grado di modificare il codice e spingere le cose - se il tuo codice comune è un riferimento NuGet, devi cambiare il codice nella soluzione comune, assicurati che sia in grado di annusare rispetto ai test e agli standard delle unità, costruire e inseriscilo nel feed NuGet (presumibilmente prima quello locale per i test, poi quello di rilascio), aggiorna il pacchetto e solo dopo aver completato la modifica.
In breve: se i vantaggi dell'accoppiamento unilaterale dei moduli superano gli svantaggi di dover mantenere il rigoroso processo di rilascio, vai per basi di codici separate per ogni modulo. Altrimenti, è perfettamente giusto tenerlo in una soluzione.