Маппинг полей карточки для выгрузки контента в отдельные файлы
Маппинг полей карточки для выгрузки контента в отдельные файлы¶
Реализация хэндлера, предоставляющего параметры сериализации для выгрузки контента карточек во внешние файлы¶
// Должен наследоваться от 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
}