Use Initialization Modules
Why use initialization modules
Section titled “Why use initialization modules”Many CMS customizations need to run once when the application starts — registering event handlers, configuring custom services, or seeding initial content. Initialization modules give you a structured hook into the CMS startup pipeline. They run after the CMS framework is ready but before the first request is served.
What you will do
Section titled “What you will do”- Create a class that implements
IInitializableModule - Add the
[InitializableModule]attribute - Use dependency attributes to control execution order
- Test that your code runs on application startup
Create a basic initialization module
Section titled “Create a basic initialization module”using Optimizely.Cms.Core;
using Optimizely.Cms.Framework.Initialization;
namespace MySite.Initialization;
[InitializableModule]
public class SiteInitialization : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
// Runs when the application starts
Console.WriteLine("Site initialization complete.");
}
public void Uninitialize(InitializationEngine context)
{
// Runs when the application shuts down
// Clean up event handlers and resources here
}
} The CMS discovers modules automatically by scanning assemblies. You do not need to register them manually.
Control execution order with dependencies
Section titled “Control execution order with dependencies”When your module depends on another module being initialized first, use the [ModuleDependency] attribute.
using Optimizely.Cms.Core;
using Optimizely.Cms.Framework.Initialization;
using Optimizely.Cms.Core.Initialization;
namespace MySite.Initialization;
[InitializableModule]
[ModuleDependency(typeof(CmsCoreInitialization))]
public class ContentEventModule : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
var events = context.Locate.Advanced
.GetInstance<IContentEvents>();
events.PublishedContent += OnContentPublished;
}
public void Uninitialize(InitializationEngine context)
{
var events = context.Locate.Advanced
.GetInstance<IContentEvents>();
events.PublishedContent -= OnContentPublished;
}
private void OnContentPublished(
object? sender, ContentEventArgs e)
{
// React to content publish
}
} Key points:
CmsCoreInitializationensures the content repository is ready before your module runs.- Always unhook events in
Uninitializeto prevent memory leaks during application recycling.
Register services with configurable modules
Section titled “Register services with configurable modules”Use IConfigurableModule when you need to register services in the dependency injection container.
using Optimizely.Cms.Core;
using Optimizely.Cms.Framework.Initialization;
using Microsoft.Extensions.DependencyInjection;
namespace MySite.Initialization;
[InitializableModule]
public class ServiceRegistrationModule : IConfigurableModule
{
public void ConfigureContainer(ServiceConfigurationContext context)
{
context.Services.AddSingleton<IEmailService, SmtpEmailService>();
context.Services.AddScoped<IPricingEngine, CustomPricingEngine>();
}
public void Initialize(InitializationEngine context)
{
// Additional startup logic after DI is configured
}
public void Uninitialize(InitializationEngine context) { }
} ConfigureContainer runs before Initialize. Use it exclusively for service registration. Put runtime logic in Initialize.
Seed initial content
Section titled “Seed initial content”A common use case is creating default content on first startup.
using Optimizely.Cms.Core;
using Optimizely.Cms.Core.Repositories;
using Optimizely.Cms.Framework.Initialization;
namespace MySite.Initialization;
[InitializableModule]
[ModuleDependency(typeof(CmsCoreInitialization))]
public class ContentSeedModule : IInitializableModule
{
public void Initialize(InitializationEngine context)
{
var repo = context.Locate.Advanced
.GetInstance<IContentRepository>();
var startPage = repo.GetDefault<StartPage>(
ContentReference.RootPage);
if (startPage == null)
{
var page = repo.GetDefault<StartPage>(
ContentReference.RootPage);
page.Name = "Home";
page.Heading = "Welcome";
repo.Save(page,
Optimizely.Cms.Core.SaveAction.Publish);
}
}
public void Uninitialize(InitializationEngine context) { }
} Common issues
Section titled “Common issues”| Issue | Cause | Fix |
|---|---|---|
| Module never runs | Missing [InitializableModule] attribute | Add the attribute to your class |
Null reference in Initialize | Dependency not yet initialized | Add [ModuleDependency] for the required module |
| Events fire twice | Module initialized twice during recycle | Use a static flag or check before subscribing |