Миграция на Платформу версии 4.1
В Платформе Атомкод произведены следующие изменения, затрагивающие совместимость версий Платформы.
Изменения формата сообщений об ошибке от некоторых сервисов
Дополнительные свойства в ApiResult<T>.Error
Добавлены дополнительные свойства в некоторых сервисах в раздел ApiResult<T>.Error ответа.
Дополнительные свойства в разделе ApiResult<T>.Error ответа
Было
{
"message": "string",
"exceptionType": "string",
"code": "string",
"source": "string",
"inners":
[
{
"message": "string",
"exceptionType": "string",
}
],
"extra": "string",
"isError": false,
"id": "string",
"type": "string"
}
Стало
{
"message": "string", // пользовательское сообщение об ошибке
"exceptionType": "string",
"code": "string",
"source": "string",
"inners":
[
{
"message": "string",
"exceptionType": "string",
}
],
"extra": "string",
"isError": false,
"id": "string",
"techMessage": "string", // техническое сообщение об ошибке
"dateTime": "DateTimeOffset",
"stackTrace": "string",
"data": {}, // Dictionary<string,string>?
"innerErrors": [], // IList<IErrorDescription>?
}
Изменения в библиотеке Models.Base
Изменение типа возвращаемого значения от некоторых сервисов с Info на IErrorDescription
Изменился тип возвращаемого значения от некоторых сервисов с ASE.MD.Platform.Base.Error.Info
на ASE.MD.Platform.Base.Models.Errors.IErrorDescription
.
Ответ десериализуется при помощи конвертеров:
ASE.MD.Platform.Base.Serialization.Converters.Newtonsoft.ErrorDescriptionNewtonsoftConverter
;ASE.MD.Platform.Base.Serialization.Converters.System.ErrorDescriptionSystemTextConverter
.
Системный сериализатор сериализует и десериализует IErrorDescription
в ErrorDescription
.
Сериализатор Newtonsoft работает в режиме совместимости:
- при чтении JSON он принимает поля как от
Info
так иIErrorDescription
и приводит их к объектуErrorDescription
. - при записи JSON он извлекает данные из
IErrorDescription
и Формирует набор свойств, десериализуемых как в старыйInfo
, так и в новыйIErrorDescription
.
Возможные проблемы и их решения
- Автотесты требуется приспособить к толератному отношению к этим свойствам, пока не будет выполнен полный переход).
- Прямые обращения к
Inners[0].Message
требуется заменить наInnerErrors[0].Message
илиInnerErrors[0].TechMessage
. - Передача объекта Error в конструктор потомков
BaseException
. Добавьте конструктор исключения конструктор, принимающийIErrorDescription
(можно как вместе, так и вместоInfo
). Также рекомендуется перейти наExtendedException
.
Изменение типа поддерживаемой ошибки в IResultWithError
Теперь IResultWithError поддерживает ошибку не Platform.Error.Info
, а ASE.MD.Platform.Base.Interfaces.IErrorDescription
Если Ваш код где-то использует информацию о вложенных ошибках, то она теперь со держится не в Inners
, а в InnerErrors
.
Пример
Строку
result.Error.Inners.Select(e => e.Message)
замените на
result.Error?.InnerErrors?.Select(e => e.Message)
Добавление дополнительного свойство ApiResult<<T>.IsError
В модели результата некоторых сервисов (ApiResult<T>) появилось дополнительное свойство isError
.
Это свойство повторяет значение свойства ApiResul<T>.Error.IsError
в случае наличия Error
и передает false в случае отсутствия раздела Error
.
Изменение последовательности применения параметров конфигурации в сервисе конфигурации
Изменена последовательность применения параметров конфигурации в сервисе конфигурации при наличии одинакового ключа в разных конфигурациях:
- приоритетнее значение того парамерта, который находится ближе к корню конфигурации самого сервиса.
- если два параметра с одним ключом находятся на одном уровне, то будет применен тот параметр, чье название подключенной конфигурации идет раньше по алфавиту.
Изменения в библиотеке Discovery.Base
Перемещение атрибутов сервисов в Startup.cs
Атрибуты сервисов из пакетов:
ASE.MD.Platform.Infrastructure.Discovery.Base.AssemblyAttribute
иASE.MD.Platform.Infrastructure.Discovery.Common.AssemblyAttribute
перемещены в пакет ASE.MD.Platform.Service.Attributes
.
Пример
В файле Startup.cs замените
using ASE.MD.Platform.Infrastructure.Discovery.Base.AssemblyAttribute;
using ASE.MD.Platform.Infrastructure.Discovery.Common.AssemblyAttribute;
на
using ASE.MD.Platform.Service.Attributes;
Изменение получения информации о сервисе
В сервисах, использующих новые библиотеки ServiceBase
версии 16.2.* для получения информации о сервисе теперь вместо
ASE.MD.Platform.Infrastructure.Discovery.Base.Core.GetServiceInfo();
следует использовать
ServiceMetadataProviderFactory.CreateProvider().GetServiceInfo()
.
Изменение способа инициализации класса MDLogger
Изменен способ инициализации класса MDLogger.
Пример
Для изменения
ILogger<T> logger = MDLoggerFactory.CreateLogger<ServiceInfoProvider, T>(Configuration);
создайте класс
using ASE.MD.Platform.Base.Abstractions;
using ASE.MD.Platform.Base.Models;
using ASE.MD.Platform.Service.Metadata.Providers;
public class ServiceInfoProvider : IServiceInfoProvider
{
public ServiceInfo GetServiceInfo()
=> ServiceMetadataProviderFactory.CreateProvider().GetServiceInfo();
}
Временное решение, будет исправлено в следующих версиях.