Tags:

Episervers modulinnstillinger

Et Episerver-nettsted av en viss størrelse vil normalt ha en del konfigurasjon som avanserte redaktører og administratorer har et forhold til. Noe konfigurasjon endres sjeldent, og kan med fordel ligge bortgjemt i konfigurasjonsfiler.

Konfigurasjon som bør være lettere tilgjengelig, kan eventuelt legges på utvalgte Episerversider. Fordelen med Episerversider er at konfigurasjonen kan endres uten at IIS må startes på nytt og at Episerver håndterer invalidering av cachen på tvers av servere. Ved å legge innstillingene slik blir de i utgangspunktet er synlig for vanlige redaktørerer, og siden de ligger på vanlige Episerversider kan man også risikere at de blir slettet eller flyttet av noen som ikke tenker på at de inneholder viktige innstillinger.

En tredje mulighet er å legge innstillingene under modulinnstillinger (eller «Plug-in Manager» / «Module settings»), her kan vi (hvis vi gjør det riktig) få alle fordelene fra to to andre alternativene, uten noen av ulempene.

Innstillingene registreres ved å bruke attributtet GuiPlugin.

Selve innstillingene

using System.Web.UI.WebControls;
using EPiServer.PlugIn;
using EPiServer.Security;
using System;

namespace Alloy.Business
{
   [GuiPlugIn(Area = PlugInArea.None, DisplayName = "Innstillinger for denne modulen", RequiredAccess = AccessLevel.Administer, RequireLicenseForLoad = false)]
   public class ModuleSettings
   {
      [PlugInProperty(Description = "Min første innstilling", AdminControl = typeof(TextBox), AdminControlValue = "Text")]
      public string SettingNumberOne { get; set; }

      [PlugInProperty(Description = "Min andre innstilling", AdminControl = typeof(TextBox), AdminControlValue = "Text")]
      public string SettingNumberTwo { get; set; }

      public ModuleSettings()
      {
         PlugInSettings.SettingsChanged += PlugInSettingsSettingsChanged;
      }

      private static void PlugInSettingsSettingsChanged(object sender, EventArgs e)
      {
         ModuleSettingsHelper.InvalidateCache<ModuleSettings>();
      }

      public static ModuleSettings Instance => ModuleSettingsHelper.GetInstance();
   }
}

Innstillingene vises under admin-modus, konfig og modulinnstillinger:Modulhåndtering

Caching
For at innstillingene skal caches, men allikevel oppdateres på alle frontendserverne når en administrator gjør en oppdatering, må vi håndtere dette selv. Jeg har laget en liten hjelpeklasse som tar seg av dette, og som brukes i kodeeksempelet over. Det viktige er å bruke EPiServer.CacheManager, som bruker remote events til å invalidere cachen på alle serverne når innstillingene oppdateres.

using EPiServer;
using EPiServer.PlugIn;

namespace Alloy.Business
{
   public class ModuleSettingsHelper
   {
      public static T GetInstance<T>() where T : class, new()
      {
         var settings = CacheManager.Get(GetCacheKey<T>()) as T;
         if (settings != null)
         {
            return settings;
         }

         settings = new T();
         PlugInSettings.AutoPopulate(settings);
         CacheManager.Insert(GetCacheKey<T>(), settings);
         return settings;
      }

      public static void InvalidateCache<T>() where T : class
      {
         CacheManager.Remove(GetCacheKey<T>());
      }

      private static string GetCacheKey<T>() where T : class
      {
         return "ModuleSettings:" + typeof(T).FullName;
      }
   }
}