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