🧩 Framework Components
Initialization
📖 Docs

Initialization Modules - Optimizely CMS 12

Exam Area: Content Area 4 – Framework Components (15%)
Reference: https://docs.developers.optimizely.com/content-management-system/docs/initialization


1. Initialization System

Initialization Modules run when the application starts. Used to:


2. IInitializableModule

using EPiServer.Framework;
using EPiServer.Framework.Initialization;

[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class MyInitializationModule : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
        // Runs when the app starts
        // Register event handlers
        var contentEvents = context.Locate.Advanced
            .GetInstance<IContentEvents>();
        
        contentEvents.PublishedContent += OnContentPublished;
        contentEvents.SavedContent += OnContentSaved;
    }

    public void Uninitialize(InitializationEngine context)
    {
        // Cleanup when the app shuts down
        var contentEvents = context.Locate.Advanced
            .GetInstance<IContentEvents>();
        
        contentEvents.PublishedContent -= OnContentPublished;
        contentEvents.SavedContent -= OnContentSaved;
    }

    private void OnContentPublished(object sender, ContentEventArgs e)
    {
        // Handle publish event
        var content = e.Content;
        // Do something...
    }

    private void OnContentSaved(object sender, ContentEventArgs e)
    {
        // Handle save event
    }
}

3. IConfigurableModule (DI Registration)

[InitializableModule]
[ModuleDependency(typeof(ServiceContainerInitialization))]
public class MyDependencyModule : IConfigurableModule
{
    public void ConfigureContainer(ServiceConfigurationContext context)
    {
        var services = context.Services;
        
        // Register services
        services.AddSingleton<IMyService, MyService>();
        services.AddScoped<IEmailService, SendGridEmailService>();
        
        // Override existing
        services.AddTransient<IContentRenderer, CustomContentRenderer>();
    }

    public void Initialize(InitializationEngine context) { }
    public void Uninitialize(InitializationEngine context) { }
}

4. ModuleDependency

Controls initialization order:

// Module A must initialize BEFORE Module B
[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]  // Built-in
[ModuleDependency(typeof(MyDatabaseInitializationModule))]       // Custom
public class MyFeatureModule : IInitializableModule
{
    // ...
}

Common built-in modules:


5. InitializationEngine

public void Initialize(InitializationEngine context)
{
    // Locate services
    var service = context.Locate.Advanced.GetInstance<IMyService>();
    
    // Access configuration
    var config = context.Locate.Advanced.GetInstance<IConfiguration>();
    
    // Check environment
    bool isDevelopment = context.Locate.Advanced
        .GetInstance<IWebHostEnvironment>().IsDevelopment();
}

6. Startup Initialization Data

[InitializableModule]
[ModuleDependency(typeof(EPiServer.Data.DataInitialization))]
public class SeedDataInitialization : IInitializableModule
{
    private readonly IContentRepository _contentRepo;

    public void Initialize(InitializationEngine context)
    {
        _contentRepo = context.Locate.Advanced
            .GetInstance<IContentRepository>();
        
        EnsureStartPage();
    }

    private void EnsureStartPage()
    {
        // Check whether the start page exists
        try
        {
            var startPage = _contentRepo.Get<StartPage>(ContentReference.StartPage);
        }
        catch (ContentNotFoundException)
        {
            // Create the start page if it does not exist
            var newStartPage = _contentRepo.GetDefault<StartPage>(
                ContentReference.RootPage);
            newStartPage.Name = "Home";
            _contentRepo.Save(newStartPage, SaveAction.Publish);
        }
    }

    public void Uninitialize(InitializationEngine context) { }
}

7. Initialization vs Program.cs

ApproachWhen to Use
Program.cs / builder.ServicesServices, middleware registration
IConfigurableModule.ConfigureContainerServices that require module dependency ordering
IInitializableModule.InitializeEvent handlers, runtime logic

8. Module Config File

<!-- Declare a module for add-ons -->
<!-- modulename/module.config -->
<?xml version="1.0" encoding="utf-8"?>
<module>
  <assemblies>
    <add assembly="MyAddonAssembly" />
  </assemblies>
</module>

Review Questions

  1. How do IInitializableModule and IConfigurableModule differ?

    • IInitializableModule: Event handlers, runtime initialization
    • IConfigurableModule: DI container registration
  2. What is [ModuleDependency] used for? (Specifies the initialization order of modules)

  3. When does Initialize() run? (When the application starts)

  4. When does Uninitialize() run? (When the application shuts down)

  5. How do you inject services in Initialize()? (context.Locate.Advanced.GetInstance<T>())