Грэм Карр | январь 2026 г.
Поскольку Optimizely CMS 13 теперь доступна в предварительной версии, разработчикам расширений необходимо понимать, какие изменения необходимы, чтобы их пакеты были совместимы с новой версией. В этом посте я расскажу о конкретных изменениях, которые я внес для миграции. Расширения OptiGraph — надстройка Optimizely CMS для управления синонимами, закрепленными результатами, веб-перехватчиками и настраиваемыми источниками данных в Optimizely Graph.
Обзор изменений CMS 13
Прежде чем углубляться в технические детали, стоит понять масштабы этой миграции. В отличие от обширного обновления CMS 11 до CMS 12 (которое включало переход с .NET Framework на .NET), миграция с CMS 12 на CMS 13 значительно проще. Основные изменения включают в себя:
- Требование .NET 10 – CMS 13 нацелена на .NET 10.
- Устаревшие API – Несколько устаревших API были помечены как устаревшие.
- Новая модель приложения – SiteDefinition заменен на более гибкую настройку приложения.
- Помощники тегов пользовательского интерфейса оболочки – Новый
элемент заменяет устаревшие помощники навигации
Шаг 1. Обновите целевую платформу
Первое и самое фундаментальное изменение — обновление целевой платформы с .NET 8 до .NET 10.
До (CMS 12):
net8.0
После (CMS 13):
net10.0
Шаг 2. Обновите ссылки на пакеты NuGet.
Все пакеты Optimizely необходимо обновить до версии 13.x. Вот что изменилось в основном проекте расширения:
До (CMS 12):
После (CMS 13):
Для примера сайта CMS потребуются дополнительные пакеты:
Шаг 3. Обновите global.json
Если ваше решение использует global.json файл, чтобы закрепить версию SDK, обновите его до .NET 10:
{
"sdk": {
"version": "10.0.102",
"rollForward": "latestMinor"
}
}
Шаг 4. Обработка устаревших API
В CMS 13 признаны устаревшими некоторые API, которые обычно использовались в расширениях. Вот что нужно искать и как это исправить:
Ссылка на страницу → Ссылка на содержимое
Если ваше расширение использует Ссылка на страницузамените его на Ссылка на контент:
// Before
PageReference pageRef = new PageReference(123);
// After
ContentReference contentRef = new ContentReference(123);
PageData.PageLink → ContentLink
// Before
var link = pageData.PageLink;
// After
var link = pageData.ContentLink;
Общий параметр IContentTypeRepository
Общий аргумент был удален из IContentTypeRepository:
// Before
IContentTypeRepository _pageTypeRepository;
// After
IContentTypeRepository _contentTypeRepository;
Изменения местоположения сервиса
Расположение сервиса через InitializationEngine.Locate и context.Locate.Advanced.GetInstance
// Before (obsolete)
var myService = context.Locate.Advanced.GetInstance();
// After (preferred)
public class MyClass
{
private readonly IMyService _myService;
public MyClass(IServiceProvider serviceProvider)
{
_myService = serviceProvider.GetRequiredService();
}
}
Кончик: Проверьте предупреждения компилятора в вашей IDE — они помогут вам узнать обо всех устаревших API-интерфейсах в вашей кодовой базе.
Шаг 5. Обновите стартовую конфигурацию
CMS 13 требует некоторой дополнительной настройки в вашем Стартап.cs:
Добавить поддержку групп посетителей
services.AddCmsAspNetIdentity()
.AddCms()
.AddAdminUserRegistration(x => x.Behavior = RegisterAdminUserBehaviors.Enabled | RegisterAdminUserBehaviors.LocalRequestsOnly)
.AddVisitorGroups() // Required in CMS 13
.AddEmbeddedLocalization();
Настройка совместимости базы данных
services.Configure(options =>
{
options.UpdateDatabaseCompatibilityLevel = true;
});
Шаг 6. Обработка изменений компонентов Blazor (.NET 10)
Если ваше расширение использует компоненты Blazor (как это делает OptiGraphExtensions), вам может потребоваться добавить это свойство в ваш потребляющий проект. .csproj:
true
Это гарантирует правильное включение статических веб-ресурсов из библиотек классов Razor, на которые имеются ссылки.
Шаг 7. Обновите страницы макета администратора с помощью новых вспомогательных тегов пользовательского интерфейса оболочки
В CMS 13 представлен новый способ интеграции страниц администрирования с навигацией Optimizely Shell с помощью вспомогательных функций тегов. Если у вашего расширения есть пользовательские страницы администрирования, вам необходимо обновить файлы макета.
Добавьте вспомогательную функцию тега EPiServer.Shell.UI.
В вашем файле макета администратора (например, _LayoutBlazorAdminPage.cshtml), добавьте новую вспомогательную ссылку на тег:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, EPiServer.Shell.UI
EPiServer.Shell.UI Вспомогательная библиотека тегов предоставляет новые пользовательские элементы для интеграции с оболочкой CMS.
Замените вспомогательные методы навигации элементом навигации по платформе
До (CMS 12):
@Html.CreatePlatformNavigationMenu()
@RenderBody()
После (CMS 13):
@RenderBody()
Новый
- Фиксированное позиционирование –
элемент создает фиксированную панель навигации вверху страницы. - Требуется смещение содержания – Вы должны добавить отступ сверху: 56 пикселей (или что-то подобное) в вашу оболочку контента, чтобы предотвратить его скрытие за фиксированной навигацией.
- Исправление прокрутки – CSS оболочки может быть установлен переполнение: скрыто на теле, поэтому вам может потребоваться переопределить это:
html, body {
overflow: auto !important;
height: auto !important;
}
Полный пример макета
Вот полный пример макета администрирования, совместимого с CMS 13:
@using EPiServer.Framework.Web.Resources
@using EPiServer.Shell.Navigation
@using EPiServer.Shell.UI.Helpers.Internal
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, EPiServer.Shell.UI
My Extension
@ClientResources.RenderResources("ShellCore")
@ClientResources.RenderResources("ShellCoreLightTheme")
@Html.AntiForgeryToken()
@RenderBody()
Шаг 8. Обновление модели приложения (конфигурация сайта)
CMS 13 заменяет Определение сайта с новым Модель приложения. После обновления ваш сайт будет возвращать ошибки 404, пока вы не перенастроите его:
- Перейдите к Настройки → Приложения в админке CMS
- Удалите приложение «Headless» по умолчанию (если оно есть).
- Создайте новое приложение «В процессе».
- Установите ссылку на стартовую страницу
- Добавьте записи хоста (например, локальный хост: 5000)
Изменения кода для SiteDefinition
Если ваше расширение обращается к конфигурации сайта программно:
// Before
var rootPage = SiteDefinition.Current.RootPage;
// After
private readonly IApplicationResolver _applicationResolver;
public async Task GetRootPageAsync(CancellationToken cancellationToken)
{
var app = await _applicationResolver.GetByContextAsync(cancellationToken);
// Or use ContentReference.RootPage for the global root
return ContentReference.RootPage;
}
Шаг 9: Тщательно протестируйте
После внесения всех изменений:
- Создайте решение - Исправлены все оставшиеся предупреждения компилятора об устаревших API.
- Запускайте модульные тесты - Убедитесь, что все тесты проходят с новой платформой.
- Протестируйте интерфейс администратора - Убедитесь, что пользовательский интерфейс вашего расширения работает правильно.
- Протестируйте всю функциональность - Пройдите каждую функцию вручную
# Build the solution
dotnet build src/OptiGraphExtensions.sln
# Run tests
dotnet test src/OptiGraphExtensions.Tests/OptiGraphExtensions.Tests.csproj
# Run the sample site
cd Sample/SampleCms
dotnet run
Что не нужно было менять
Стоит отметить, что при миграции осталось неизменным:
- Модели Entity Framework и DbContext - Только что обновленные версии пакетов
- Контроллеры MVC и конечные точки API - Никаких изменений в маршрутизации или структуре контроллера.
- Компоненты Блазор - Код компонента остался прежним
- Просмотры контента - Шаблоны страниц и блоков работают одинаково.
- Конфигурация модуля - модуль.конфигурация формат не изменен
- Политики авторизации - Тот же подход работает в CMS 13.
Краткое изложение изменений
| Область | Требуется изменение |
|---|---|
| Целевая структура | сеть8.0 → сеть10.0 |
| пакеты EPiServer | 12.х → 13.0.0-превью2 |
| Entity Framework | 8.0.х → 10.0.х |
| Ссылка на страницу | Заменить на Ссылка на контент |
| Определение сайта | Использовать IApplicationResolver |
| Расположение сервиса | Используйте внедрение конструктора |
| Стартап.cs | Добавлять ДобавитьVisitorGroups() и Обновление уровня совместимости базы данных |
| Blazor (потребляющий проект) | Добавлять ТребуетAspNetWebAssets свойство |
| Административные макеты | Добавлять @addTagHelper *, EPiServer.Shell.UI и использовать |
| Оболочка навигации | Заменять @Html.CreatePlatformNavigationMenu() с |
Заключение
Миграция расширения Optimizely CMS с версии 12 на 13 относительно проста по сравнению с предыдущими обновлениями основных версий. Основная работа включает обновление версий пакетов, замену устаревших API их современными эквивалентами и тщательное тестирование.
Для OptiGraphExtensions чистая архитектура расширения — с использованием внедрения зависимостей повсюду и отсутствием местоположения службы — означала, что большая часть кода вообще не требовала изменений. Это хорошее напоминание о том, почему следование современным шаблонам .NET приносит дивиденды, когда приходит время обновления.
Ресурсы
Примечание. Это руководство основано на предварительной версии CMS 13. Некоторые детали могут измениться до финального релиза. Всегда обращайтесь к официальной документации Optimizely для получения самой актуальной информации.
26 января 2026 г.
Ещё по этой теме
