Organizzare le cartelle di primo livello di una solution in .NET
Ci sono diversi modi per creare una Solution Multi-Project o Single Project da zero, per esempio utilizzando la .NET command-line interface (CLI) o la GUI di Visual Studio (VS), analizziamoli. Come esempio, creiamo una solution divisa in quattro progetti con una struttura ben definita, suddivisa con due cartelle di primo livello: una cartella src (qui metteremo la logica di business, le astrazioni, le entità, le eccezioni) e una cartella tests, dove posizioneremo i test unitari per ogni progetto.
Tramite .NET CLI
La CLI fornisce molti comandi che sono installati di default e eseguono un’azione, nel nostro caso ne useremo solo un paio. Questi comandi creano rapidamente la struttura base per i nostri progetti.
Come primo passo usiamo il comando dotnet new che crea un progetto .NET o altri artefatti basati su un modello specifico. Nel nostro caso è necessario creare una solution vuota passandogli l’argomento sln come mostrato sotto:
dotnet new sln -n NameOfMySolution.Cli
Il passo successivo è creare la cartella src e aggiungere i nostri progetti. Per fare questo usiamo il comando dotnet new classlib -o, che configura una libreria di classi e l’opzione -o è utile per il nostro scopo per indicare la directory di output.
dotnet new classlib -o src/StructuredApp.Cli.Domain
dotnet new classlib -o src/StructuredApp.Cli.Infrastructure
dotnet new classlib -o src/StructuredApp.Cli.Application
dotnet new console -o src/StructuredApp.Cli.Console
Facciamo lo stesso con la cartella tests, questa volta usiamo il comando dotnet new mstest per creare un progetto di test unitari:
dotnet new mstest -o tests/StructuredApp.Cli.Domain.UnitTests
dotnet new mstest -o tests/StructuredApp.Cli.Infrastructure.UnitTests
dotnet new mstest -o tests/StructuredApp.Cli.Application.UnitTests
dotnet new mstest -o tests/StructuredApp.Cli.Console.UnitTests
Non è ancora finito, l’ultimo passo è aggiungere i progetti alla solution (possiamo aggiungere più progetti alla solution in un singolo comando separandoli con uno spazio).
dotnet sln add .\src\StructuredApp.Cli.Application .\src\StructuredApp.Cli.Domain .\src\StructuredApp.Cli.Infrastructure .\src\StructuredApp.Cli.Console .\tests\StructuredApp.Cli.Application.UnitTests .\tests\StructuredApp.Cli.Domain.UnitTests .\tests\StructuredApp.Cli.Infrastructure.UnitTests .\tests\StructuredApp.Cli.Console.UnitTests
e qui sotto c’è lo screenshot dell’output finale visto da VS:

Tramite VS GUI
In questo caso non conosco un metodo standard e pulito come quello precedente, la soluzione è un po’ sporca ma raggiunge l’obiettivo finale. Come prima cosa, crea una solution vuota, nella barra dei menu, seleziona File > Nuovo > Progetto. Nel pannello dei template, seleziona Altri Tipi di Progetto > Soluzioni VS nell’elenco espanso. Nel pannello centrale, seleziona Soluzione Vuota. Ora appare così:

Il secondo passo è impostare una nuova Cartella Soluzione chiamata src cliccando con il tasto destro sulla Solution > Aggiungi > Nuova Cartella Soluzione. Questo creerà una cartella logica, non fisica. Clicca con il tasto destro sulla cartella della soluzione src e apri una nuova finestra di dialogo del progetto, aggiungi uno dei progetti, per esempio StructuredApp.Gui.Application ma prima di salvare, devi cambiare la posizione del progetto, crea la directory reale src all’interno della cartella della tua solution nel file system. A questo punto VS metterà il progetto al suo interno. Tuttavia le due cartelle “src” non sono le stesse ma in questo modo la struttura della vista della tua solution seguirà la struttura su disco.
Ripeti questa configurazione per i restanti progetti StructuredApp.Gui.Domain, StructuredApp.Gui.Infrastructure e StructuredApp.Gui.Console. Applica ora lo stesso metodo anche per la cartella tests, creiamo una directory fisica e includiamo StructuredApp.Gui.Application.UnitTests, StructuredApp.Gui.Domain.UnitTests, StructuredApp.Gui.Infrastructure.UnitTests e StructuredApp.Gui.Console.UnitTests. Questo è il risultato finale che ottieni:

Conclusione
Trovo che suddividere correttamente la solution sia importante e a mio parere entrambi i metodi sono accettabili. Nel complesso la .NET CLI è uno strumento potente e penso che rompa la dipendenza dello sviluppatore .NET dall’IDE Visual Studio. Se sei curioso come sviluppatore, probabilmente non sei favorevole ad essere legato a un singolo strumento di sviluppo, e la CLI ti dà un’idea di cosa di solito succede sotto il cofano.
Ciao, Alberto
Related Posts

Exception Filters in .NET Framework: Addio all'inferno dei Try-Catch
Gestione delle eccezioni in .NET Framework 4.8 usando Exception Filters personalizzati

Utilizzare le Value Tuple
Tutti noi scriviamo metodi che restituiscono un valore, un metodo string restituisce una stringa, un metodo int restituisce un int, ma cosa fai quando hai bisogno di restituire più di un valore?

Dictionary invece di switch o if statements v2
Nell'articolo precedente ho parlato di come, a mio parere, sia possibile migliorare la qualità del codice memorizzando chiavi/valori in un dictionary invece di usare switch o istruzioni condizionali.