Exam Area: Content Area 4 – Framework Components (15%)
Reference: https://docs.developers.optimizely.com/content-management-system/docs/initialization
Initialization Modules run when the application starts. Used to:
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
}
}
[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) { }
}
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
{
// ...
}
EPiServer.Web.InitializationModule – CMS web initializationServiceContainerInitialization – DI container setupEPiServer.Data.DataInitialization – Database setupEPiServer.Cms.Shell.UI.Infrastructure.InitializationModule – CMS UIpublic 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();
}
[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) { }
}
| Approach | When to Use |
|---|---|
Program.cs / builder.Services | Services, middleware registration |
IConfigurableModule.ConfigureContainer | Services that require module dependency ordering |
IInitializableModule.Initialize | Event handlers, runtime logic |
<!-- Declare a module for add-ons -->
<!-- modulename/module.config -->
<?xml version="1.0" encoding="utf-8"?>
<module>
<assemblies>
<add assembly="MyAddonAssembly" />
</assemblies>
</module>
How do IInitializableModule and IConfigurableModule differ?
IInitializableModule: Event handlers, runtime initializationIConfigurableModule: DI container registrationWhat is [ModuleDependency] used for? (Specifies the initialization order of modules)
When does Initialize() run? (When the application starts)
When does Uninitialize() run? (When the application shuts down)
How do you inject services in Initialize()? (context.Locate.Advanced.GetInstance<T>())