Umbraco 9

Voor het bouwen van Health Valley’s nieuwe website maken wij gebruik van Umbraco 9. Dit is op het moment van schrijven de nieuwste versie van het meest gebruiksvriendelijke CMS. Umbraco 9 valt bij ons goed in de smaak.

Umbraco 9 header afbeelding

De grootste verandering .NET 5 en ASP.NET Core

Ten opzichte van Umbraco 8 heeft Umbraco 9 veel gunstige nieuwe features. De grootste verandering is het gebruik van een nieuw framework: .NET 5 en ASP.NET Core. Het framework wat Umbraco voorheen gebruikte, .NET Framework, wordt immers niet meer doorontwikkeld door Microsoft.

De voordelen

De introductie van .NET 5 in Umbraco brengt meerdere voordelen met zich mee. Denk bijvoorbeeld aan het feit dat .NET 5 cross-platform development aanbiedt, waardoor je jouw Umbraco website op Linux, macOS of op Windows kan ontwikkelen.

Dependency injection

Ook worden .NET 5 features, zoals dependency injection, ondersteund. De code wordt hierdoor minder complex, aangezien zoveel mogelijk onnodige code wordt weggelaten. Je kan er bijvoorbeeld voor kiezen om services te injecteren in je Razor views.

Configuration

Naast dependency injection maken wij ook gebruik van de configuration die .NET 5 biedt, waarmee we bepaalde configuratie-waarden kunnen opslaan. Dit kan bijvoorbeeld gebruikt worden in combinatie met User Secrets om sensitieve data, zoals API keys, op een veilige manier op te slaan. Gevoelige informatie moet immers niet beschikbaar zijn voor onbevoegden.

Onderstaand codevoorbeeld demonstreert het gebruik van configuration in .NET 5. In ons project voor Health Valley hebben we een koppeling met SalesForce, waarin klantgerelateerde data wordt opgeslagen. Hiernaast kan je er ook voor opteren om de configuration settings in een klasse te wikkelen, een zogenaamde POCO (Plain Old CLR Object).

private readonly string _clientId;
private readonly string _clientSecret;
private readonly string _loginEndpoint;
private readonly string _password;
private readonly string _username;

public SalesforceClient(IConfiguration configuration)
{
   _loginEndpoint = configuration.GetValue<string>("SalesForce:loginEndpoint");
   _username = configuration.GetValue<string>("SalesForce:username");
   _password = configuration.GetValue<string>("SalesForce:password");
   _clientId = configuration.GetValue<string>("SalesForce:clientId");
   _clientSecret = configuration.GetValue<string>("SalesForce:clientSecret");
}

Library Examine voorbeeld

Naast .NET 5 features biedt Umbraco 9 meerdere dependencies die geüpdatet zijn. Een voorbeeld hiervan is de library Examine, gebaseerd op Lucene.NET, die zoekfunctionaliteiten binnen Umbraco websites ondersteund. In onze ervaring werkt de nieuwe versie van Examine erg goed. Er is op het moment van schrijven enkel wel een tekort aan documentatie, waardoor het implementeren van sommige Examine features lastiger is. Het is echter een kwestie van tijd voordat de documentatie voor de nieuwe versie uitgebracht wordt.

Hieronder staat een stuk voorbeeldcode wat betreft Examine. Aan de hand van dependency injection kan de IExamineManager worden opgehaald, waarmee een search index wordt opgehaald.

public class ExamineService
{
   private readonly IExamineManager _examineManager;

   public ExamineService(IExamineManager examineManager)
   {
       _examineManager = examineManager;
   }

   public ISearchResults SearchBySearchTerm(string searchTerm, string indexName)
   {
       if (!_examineManager.TryGetIndex(indexName, out var index))
       {
           throw new InvalidOperationException("Index was not found.");
       }

       var searcher = index.Searcher;
      
       return !string.IsNullOrEmpty(searchTerm)
           ? searcher.Search(searchTerm)
           : searcher.CreateQuery().All().Execute();
   }
}

Performance en notificatiesysteem

Ook vanuit de gebruiker is de nieuwe versie van Umbraco een mooi stuk technologie. De performance van Umbraco 9 sites ten opzichte van oudere Umbraco sites is vele malen beter.

Daarnaast verbetert het nieuwe notificatiesysteem de gebruikerservaring. Zo’n notificatie fungeert als een soort webhook. Je kan bijvoorbeeld gebruik maken van de ContentPublishingNotification, die de meegegeven code uitvoert wanneer een stuk content wordt gepubliceerd.

public class LogImportantAnnouncement
{
   private readonly ILogger _logger;

   public LogImportantAnnouncement(ILogger logger)
   {
       _logger = logger;
   }

   public void Handle(ContentPublishingNotification notification)
   {
       foreach (var entity in notification.PublishedEntities)
       {
           if (!entity.ContentType.Alias.Equals("announcement")) continue;
          
           var announcementCategory = entity.GetValue<string>("category");

           if (announcementCategory.Equals("important"))
           {
               _logger.Information($"Important announcement: {entity.Id}");
           }
       }
   }
}

In voormalige versies van Umbraco werd hiervoor gebruik gemaakt van events. Hoewel de twee manieren van werken functioneel niet veel verschillen, bestaan er wel verschillen in de manier waarop notifications ten opzichte van events worden gemaakt.

Zo kunnen notifications worden geregistreerd aan de hand van de IUmbracoBuilder, waarmee ze makkelijk als services kunnen worden geregistreerd in de ConfigureServices method.

public static class UmbracoBuilderNotificationExtensions
{
   public static IUmbracoBuilder AddAnnouncementNotifications(this IUmbracoBuilder builder)
   {
       builder.AddNotificationHandler<ContentPublishingNotification, LogImportantAnnouncement>();

       return builder;
   }
}
public void ConfigureServices(IServiceCollection services)
{
   services.AddUmbraco(_env, _config)
       .AddBackOffice()
       .AddWebsite()
       .AddComposers()
       .AddAnnouncementNotifications()
       .Build();
}

Wij als team zijn erg tevreden met de performance, de overzichtelijke architectuur van de code en de functionaliteiten die Umbraco 9 met zich mee brengt!

Geschreven door: Luuk Janssens, Certified Umbraco developer