Перейти к основному содержимому

Миграция на Платформу версии 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.
Возможные проблемы и их решения
  1. Автотесты требуется приспособить к толератному отношению к этим свойствам, пока не будет выполнен полный переход).
  2. Прямые обращения к Inners[0].Message требуется заменить на InnerErrors[0].Message или InnerErrors[0].TechMessage.
  3. Передача объекта 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&lt<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();
}

Временное решение, будет исправлено в следующих версиях.

Изменения для сервисов, не использующих стандартную для Платформы процедуру инициализации и запуска

Изменение метода ASE.MD.Platform.Infrastructure.Discovery.Base.Core.Startup

Метод ASE.MD.Platform.Infrastructure.Discovery.Base.Core.Startup() изменен на ASE.MD.Platform.Utils.ServiceBase.PlatformService.Startup()

Изменение работы секции HostBuilder ConfigureAppConfiguration

Для сервисов, настраиваемых в обход стандартной процедуры запуска платформенного сервиса изменяется работа секции HostBuilder ConfigureAppConfiguration:

Пример

Замените

string aspNetCoreEnvironment 
= Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? Environments.Production;

IConfigurationProvider nginxProvider = null;
IMDSettingsConfiguration mdSettingsConfigureProvider = null;

IHostBuilder hostBuilder = Host
.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((builderContext, configurationBuilder) =>
{
configurationBuilder.AddMdSettings("mdsettings.json", true, true, provider => mdSettingsConfigureProvider = provider);
configurationBuilder.AddJsonFile("appsettings.json");
configurationBuilder.AddJsonFile($"appsettings.{aspNetCoreEnvironment}.json", optional: true, reloadOnChange: true);
configurationBuilder.AddNginxConfigure(provider => nginxProvider = provider);
configurationBuilder.AddEnvironmentVariables();
})

...

.ConfigureServicesEx(opt =>
{
opt.AddSingleton<IMDSettingsConfiguration>(mdSettingsConfigureProvider);
opt.AddSingleton<IConfigurationProvider>(nginxProvider);
});

на следующий блок кода

IPlatformConfigurationBuilder configurationBuilder 
= PlatformService.CreatePlatformConfigurationBuilder(_startParameters);

IConfigurationRoot configuration
= configurationBuilder.Build();

IMDSettingsConfiguration defaultServiceConfiguration
= configurationBuilder.DefaultConfiguration;

IHostBuilder hostBuilder = Host
.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((builderContext, configurationBuilder) =>
{
configurationBuilder.AddConfiguration(configuration);
})

...

.ConfigureServices((hostBuilderContext, services) =>
{
services
.AddSingleton<IMDSettingsConfiguration>(defaultServiceConfiguration);
});

Изменение вызова метода SetServiceHostSetServiceHost

Изменен вызов метода SetServiceHost

Пример

Для изменения вызова метода SetServiceHost замените

PlatformHost.SetServiceHost(host);

на

ServiceHostProvider.SetServiceHost(host);

Устаревание метода AddPlatformMetricsAccessor

Метод AddPlatformMetricsAccessor устарел и более не используется. Метрики в Платформе версии 4.1 собираются другим образом. Вызов метода требуется удалить.

services.AddPlatformMetricsAccessor();