Mds.Libraries.CSharp.DisplaySchema 2.3.1
Mds.Libraries.CSharp.DisplaySchema
Пакет для удобной работы с выходными сущностями для Api.
Основные задачи пакета:
- Уйти от формирования
DTOдля формаирования ответа сервера - Дать фронту возможность заказывать для получения только те сущности, которые ему сейчас нужны.
Пример работы с DisplaySchema
// Пример Action для получения **сущности**
[HttpGet("offers/{offerId}")]
public async Task<JToken> FindAsync(long offerId, [FromQuery] IncludePropertiesParameters parameters)
{
var result = await Query.CheckAndFindAsync(offerId);
// Формируем схему
var schema = new DisplaySchema<ComplexOffer>()
{
{ "id", o => o.Id, Visibility.Always },
// Формат вывода для Datetime
{ "created_at", o => o.CreatedAt, DateTimeFormat.Timestamp },
{ "updated_at", o => o.UpdatedAt, DateTimeFormat.Timestamp },
{ "partner_id", o => o.PartnerId },
// Вложенные сущности
{ "harmonization_link", o => o.Link, new DisplaySchema<HarmonizationLink>()
{
{ "id", l => l.Id, Visibility.Always },
{ "created_at", l => l.CreatedAt, DateTimeFormat.Timestamp },
{ "updated_at", l => l.UpdatedAt, DateTimeFormat.Timestamp },
{ "good", l => l.Good, new DisplaySchema<Good>()
{
// Указание уровня видимости
{ "id", l => l.Id, Visibility.Always },
{ "name", l => l.Name }
}
},
// Формат вывода для Enum
{ "catalog", l => l.Catalog, EnumFormat.Description },
{ "quality", l => l.Quality }
}
}
};
// Формируем JToken с поомощью схемы и найденной сущности
return schema.JsonBuild(result, parameters.Properties);
}
// Класс для передачи свойств, которые необходимо отобразить.
// Ожидается формат свойст через точку. Для массивов тоже.
// Например: [ "id", "harmonization_link.good.id", "harmonization_link.good.name" ]
// Если свойства не будут указаны, тогда будут отображены все.
public class IncludePropertiesParameters
{
[FromQuery(Name = "include_property")]
public IEnumerable<string> Properties { get; set; }
}
Использование Visibility
Если вы хотите, чтобы определенное свойство отображалось всегда, когда отображается родительское свойство, тогда его надо пометить как Visibility.Always. Поведение по умолчанию Visibility.OnDemand.
Из примера выше, это будет работать так:
- Если было запрошено
harmonization_link.created_at, тогдаharmonization_link.idбудет отображено. - Если из
harmonization_linkне было запррошено ни одного свйоства, и не было запрошеноharmonization_link, тогдаharmonization_link.idНЕ будет отображено
Использование IDisplayValueFormatter
Если вам нужен свой форматтер для какого либо типа поля, вы можете его передать после выражения для этого свойства.
var formatter = new CustomDateTimeFormatter()
var schema = new DisplaySchema<ComplexOffer>()
{
{ "created_at", o => o.CreatedAt, formatter },
};
// Реализация собственного форматтера для отображения свойства
internal class CustomDateTimeFormatter : IDisplayValueFormatter<DateTime>
{
internal CustomDateTimeFormatter() {}
#region IDisplayValueFormatter
object IDisplayValueFormatter<DateTime?>.Prepare(DateTime value)
{
// Тут нужно описать реализацию форматтера
}
#endregion IDisplayValueFormatter
}
Специальное расширение для работы с вложенной сущностями
Иногда требуется для фронта сделать видимость вложенной сущности, но для нас это одна и та же сущность. Для таких случаев есть сспециальное расширение.
var schema = new DisplaySchema<UtekaPosition>()
{
{ "id", c => c.Id, Visibility.Always },
{ "created_at", c => c.CreatedAt, DateTimeFormat.Timestamp },
{ "updated_at", c => c.UpdatedAt, DateTimeFormat.Timestamp },
// Мы не передаем expression, потому что он будет вида p => p, а сразу передаем схему новую.
{ "raw", new DisplaySchema<UtekaPosition>()
{
{ "id", c => c.ExternalId, Visibility.Always },
{ "name", c => c.Name },
}
},
};
Расширение для работы с DateTime
Для форматирования DateTime и DateTimeOffset написано специальное расширение и есть встроенный форматтер.
var schema = new DisplaySchema<ComplexOffer>()
{
// Работа с DateTime с указанием необходимого формата вывода
{ "created_at", o => o.CreatedAt, DateTimeFormat.Timestamp },
};
Возможные форматы
Timestamp- выводим в unix timestamp
Расширение для работы с Enum
Для форматирования Enum написано специальное расширение и есть встроенный форматтер.
var schema = new DisplaySchema<ComplexOffer>()
{
// Работа с Enum с указанием необходимого формата вывода
{ "catalog", l => l.Catalog, EnumFormat.Description },
};
Возможные форматы
Value- берем значение EnumName- берем имя значения EnumDescription- берем значение из аттрибутаDescriptionEnumMember- берем значение из аттрибутаEnumMember
No packages depend on Mds.Libraries.CSharp.DisplaySchema.
.NET 7.0
- Mds.Libraries.CSharp.Extensions (>= 2.0.2)
- Microsoft.AspNetCore.Mvc (>= 2.2.0)
- Newtonsoft.Json (>= 13.0.3)
| Version | Downloads | Last updated |
|---|---|---|
| 2.3.1 | 2 | 02/28/2026 |
| 2.3.0 | 1 | 02/28/2026 |
| 2.2.0 | 1 | 02/28/2026 |
| 2.2.0-beta.12319 | 1 | 02/28/2026 |
| 2.2.0-beta.12317 | 1 | 02/28/2026 |
| 2.1.0 | 1 | 02/28/2026 |
| 2.1.0-beta.11898 | 1 | 02/28/2026 |
| 2.0.0 | 1 | 02/28/2026 |
| 1.2.1 | 1 | 02/28/2026 |
| 1.1.0 | 1 | 02/28/2026 |