Перейти к содержанию

Маппинг полей карточки для выгрузки контента в отдельные файлы

Маппинг полей карточки для выгрузки контента в отдельные файлы

Реализация хэндлера, предоставляющего параметры сериализации для выгрузки контента карточек во внешние файлы

// Должен наследоваться от IStorageMappingHandler public abstract class ExampleStorageMappingHandler : IStorageMappingHandler { // Должен реализовать метод GetContentMappings() public virtual IList<IStorageContentMapping> GetContentMappings(Card card) { // Простые способы добавления маппингов: var result = new List<IStorageContentMapping> { // Маппинг для строковой секции, задает параметры выгрузки для поля "FieldName". new StorageContentMapping( "Sections.EntrySectionName.Fields.EntryFieldName", // Путь внутри storage, по которому расположен контент для выгрузки. "EntryFieldName.txt", // Основа имени файла выгружаемого контента, к имени файла будет добавлено хэш-значение, чтобы исключить вероятность файлов с одинаковым именем. ),

// Маппинг для табличной секции, задает параметры выгрузки для поля "FieldName" всех строк секции "TableSectionName". new StorageContentMapping( "Sections.TableSectionName.Rows[].TableFieldName", // Wildcard [] означает, что логика обработает каждую строку в данной секции. "FieldName.txt", new []{ CardHelper.DefaultRowIDKey }, // Наименование поля, по которому расположено значение, которое необходимо учитывать при добавлении хеша к имени внешнего ресурса с контентом (например идентификатор строки). nameof(CustomStorageContentConverter) // Опционально. Наименование конвертера содержимого, который будет использоваться перед выгрузкой. ),

};

// Так же может быть использована произвольная логика для добавления маппингов: if (card.Sections.TryGetValue("SchrodingerSectionName", out var section)) { result.Add( new StorageContentMapping( "Sections.SchrodingerSectionName.Rows[].Metadata", "SchrodingerMetadata.cs", CardHelper.DefaultRowIDKey));

for (var i = 0; i < section.Rows.Count; i++) { var row = section.Rows[i];

// Например объект может не содержать определенных полей полей. var settings = row.Fields.TryGet<IDictionary<string, object>>("Settings"); if (settings is not null && settings.ContainsKey("CustomMetadata")) { result.Add( new StorageContentMapping( $"Sections.SchrodingerSectionName.Rows[{i}].Settings.CustomMetadata", // здесь индексатор [{iStr}] означает, что логика обработает только указанную строку секции. "CustomMetadata.cs", "^.RowID")); } } } return result; } }

Регистрация хэндлера, предоставляющего параметры сериализации для выгрузки контента карточек во внешние файлы

// Регистрация должна быть для сервера и для консольного клиента [Registrator(Tag = RegistratorTag.ConsoleClient | RegistratorTag.Server)] public sealed class Registrator : RegistratorBase { public override void FinalizeRegistration() { this.UnityContainer .TryResolve<IStorageMappingResolver>()? .Register<ExampleStorageMappingHandler>(ExampleCardTypeID) // Параметр: Guid - ID типа карточки .Register<AnotherStorageMappingHandler>(AnotherCardTypeID) ; } }

Реализация конвертера для выгружаемого содержимого

// Должен наследоваться от IStorageContentConverter public class CustomStorageContentConverter : IStorageContentConverter { #region IStorageContentConverter Implementation

/// <inheritdoc /> public ValueTask<object?> ConvertValueAsync(object? value, CancellationToken cancellationToken = default) { // Например, ожидаем строковое содержимое. var inputString = value?.ToString(); return inputString is null ? new ((object?) null) : FormatRichTextHtmlAsync(inputString, cancellationToken); }

#endregion }

Регистрация конвертера выгружаемого содержимого

// Необходимо зарегистрировать для клиента, консольного клиента и сервера. [Registrator(Tag = RegistratorTag.DefaultForStorageContent)] public class Registrator : RegistratorBase { #region Base Overrides

public override void RegisterUnity() { // Конвертер необходимо регистрировать по имени. // Это имя необходимо указывать в реализации IStorageMappingHandler, где требуется данный конвертер. // В данном случае это будет nameof(CustomStorageContentConverter). this.UnityContainer .RegisterSingleton<IStorageContentConverter, CustomStorageContentConverter>(nameof(CustomStorageContentConverter)); }

#endregion }

Back to top