Visual Studio Solution Filters

Visual Studio is een geweldig product, maar de performance van Visual Studio bij grotere solutions wil nog wel eens een punt van aandacht zijn. Ook kan een solution met daarin heel veel projecten de aandacht wel eens afleiden van de code die aangepast moet worden. Dit geldt zeker voor een nieuwkomer op een project die in één keer heel veel code ziet en daardoor moeite zal hebben om door de bomen het bos te zien. In Visual Studio 2019 is een feature geïntroduceerd die hierbij kan helpen: solution filters. In dit artikel wordt uitgelegd hoe deze feature gebruikt kan worden.

Instellen solution filter

Om solution filters in te stellen, moet de solution met de optie “Open a project or solution” geopend worden (Figuur 1).

Bij de bestandsselectie is het belangrijk om de optie “Do not load projects” aan te zetten (Figuur 2).

De solution wordt nu geopend zonder de projecten te laden (Figuur 3).

Voor alleen die projecten die te maken hebben met bijvoorbeeld de “WeatherForecast” kan een solution filter worden ingesteld. Hiervoor zijn twee mogelijkheden. Ten eerste kan een project geladen worden inclusief de afhankelijkheden met andere projecten (Figuur 4).

Het project “WeatherForecastService” is afhankelijk van “WeatherForecaseStreamingService.Contracts” en dit laatste project zal dus ook gelijktijdig geladen worden. De andere optie is om een enkelvoudig project te laden. De “WeatherForecastClient” heeft geen afhankelijkheid van de service en zal dus ook nog apart geladen moeten worden (Figuur 5).

Binnen de solution zijn op dit moment alleen die projecten geladen die te maken hebben met de WeatherForecast, dus het doel is bereikt (Figuur 6).

Bij het bouwen van de solution worden nu alleen de drie actieve projecten gebouwd (Figuur 7).

Een code analyse op de solution, neemt ook alleen maar de geladen projecten mee (Figuur 8).

Ook de unit testen die gedraaid worden, beperken zich tot de geladen projecten (Figuur 9). Voor dit voorbeeld is een solution filter ingesteld op een solution die gebaseerd is op een Onion architectuur. Binnen de complete solution zitten heel veel unit testen, maar die zijn nu ook niet allemaal zichtbaar.

Bij het opslaan van de solution, wordt de geladen status van de projecten ook bijgehouden. Als de solution dus geopend wordt, zijn weer alleen de geladen projecten direct zichtbaar. Als voor een aanpassing nu andere projecten nodig zijn, dan moeten deze extra projecten weer geladen worden en andere projecten eventueel ontladen. Dit is niet handig, zeker niet in teamverband. De gewenste projecten kunnen natuurlijk in een losse solution op worden genomen, maar dat vereist extra onderhoud als nieuwe projecten aan de solution toe moeten worden gevoegd. Deze nieuwe projecten moeten dan namelijk aan meerdere solutions toe worden gevoegd. In verband met de kans op fouten is dit niet handig. Gelukkig kan de staat van de geladen projecten gemakkelijk opgeslagen worden als een filter op de solution. Hiervoor kan gebruik worden gemaakt van de optie “Save as Solution Filter” in het contextmenu van de solution (Figuur 10).

Het solution filter moet een bestandsnaam krijgen met de extensie “slnf”.

Na het opslaan van het solution filter bestand is het belangrijk om alle projecten in de solution weer te laden. De solution zelf moet namelijk idealiter alle projecten geladen bevatten en via een of meerdere solution filters kunnen dan selecties worden gemaakt. Voor het herladen van alle projecten kan gebruik worden gemaakt van de optie “Load All Projects” uit het contextmenu van de solution (Figuur 12). Het herladen van de projecten kan in een grote solution wel even duren.

De solution en het solution filter kunnen nu apart van elkaar worden geopend (Figuur 13).

De solution explorer geeft aan dat een solution filter geopend is (Figuur 14). Het totaal aantal projecten in de parent-solution wordt hierbij namelijk ook getoond.

De bestandsindeling van een solution filter is heel anders dan van een solution (Figuur 15). Binnen het bestand van een solution filter worden alleen maar die projecten genoemd die geladen moeten worden en verder wordt de koppeling met de originele solution gelegd. Hiermee ontstaat dus een oplossing die beter onderhoudbaar is, dan wanneer een kopie zou zijn gemaakt van de originele solution file.

Wisselen tussen solution en solution filter

Tijdens het werken met de code moet soms worden gewisseld tussen het solution filter en de complete solution. Voor een GIT push is het bijvoorbeeld handig om vooraf alle unit testen te draaien. Gelukkig biedt Visual Studio hier hele goede ondersteuning voor. Via de switch-optie boven in de Solution Explorer (Figuur 16) kan gemakkelijk worden gewisseld tussen de solution en het solution filter. Door te dubbelklikken op de gewenste keuze, wordt die keuze geladen.

Na het laden van het solution filter geeft Visual Studio ten onrechte soms de melding dat de projecten in het filter aangepast zijn, zonder dat dit het geval is (Figuur 17). Deze melding kan veilig worden genegeerd. Kiezen voor update kan ook zonder bijwerkingen.

Aanpassen solution filter

Het kan natuurlijk voorkomen dat een bestaand filter aangepast moet worden. Gelukkig wordt dit ook ondersteund. In het contextmenu van de solution is hiervoor de optie “Show Unloaded Projects” (Figuur 18) beschikbaar. Deze functionaliteit kan ook worden bereikt door te klikken op de knop van “Show All Files” in de menubalk van de Solution Explorer (Figuur 19).

De volledige lijst met projecten wordt nu weer getoond (Figuur 20).

Via de opties “Reload Project” of “Reload project with Dependencies” kunnen nu extra projecten worden toegevoegd aan het filter. Na het herladen wordt nu terecht de melding getoond dat het filter aangepast is en dat deze moet worden geüpdatet (Figuur 21).

De inhoud van het filterbestand wordt na het klikken op update direct aangepast (Figuur 22).

De projecten die niet zichtbaar hoeven te zijn binnen het filter, kunnen weer worden verborgen met de optie “Hide Unloaded Projects” (Figuur 23) of door gebruik te maken van het knopje in de menubalk van de Solution Explorer.

Ondersteuning in Visual Studio for Mac

De ondersteuning van solutions filters in Visual Studio for Mac is helaas niet zo compleet als onder Windows. Solution filters kunnen wel geladen worden in Visual Studio for Mac (Figuur 24) en deze worden ook correct geladen (Figuur 25). Het aanmaken en aanpassen van de solution filters zelf, kan helaas nog niet met Visual Studio for Mac. Hiervoor is dus echt de Windows-versie nodig of het bestand moet met de hand worden aangepast. Handmatige aanpassing neemt wel een stuk van de handigheid van de solution filters weg en is bovendien natuurlijk heel erg foutgevoelig.

Samenvatting

In dit artikel is de werking van solution filters in Visual Studio getoond. De ondersteuning in de Mac-versie is op dit moment nog te beperkt om bruikbaar te zijn als alleen op een Mac wordt gewerkt. Met de filters kan een losse view op een complete solution gemaakt worden die sneller zal laden, maar zeker ook minder complex zal ogen voor een beginnend ontwikkelaar op het team. Het is wel belangrijk om niet alleen vanuit het solution filter te werken, want regelmatig is het nodig om zeker te weten dat de hele solution ook bouwt en zonder problemen draait. Eventueel kan hiervoor natuurlijk ook de .NET-CLI gebruikt worden.

Op https://github.com/johansmarius staat de code die gebruikt is in dit artikel. De screenshots in dit artikel zijn afkomstig uit deze code.