Читая о Деконструкция Я заметил, что вы можете вытащить выбранные свойства из объекта в кортеж.Это отличный способ вернуть подмножество объектов из запроса таблицы Azure, которые в противном случае заполнили бы ваш объект запроса свойствами, которые вам могут не понадобиться (например, eTag, PartitionKey, RowKey и т. Д.).
В прошлом я создавал свой класс, и в нем я создаю DTO для представления подмножества свойств, которые я хочу вернуть из запроса веб-API, следующим образом:
public class Person : TableEntity
{
public Person(string firstName, string lastName)
{
PartitionKey = firstName;
RowKey = lastName;
}
public Person(){} //parameterless constructor needed by Azure Tables
public string SomeValue1 {get; set;}
public string SomeValue2 {get; set;}
}
public class PersonDTO
{
public string SomeValue1 {get; set;}
public string SomeValue2 {get; set;}
}
Когда я использую свой Person
объект, я думаю, что мог бы создать метод расширения, который возвращает кортеж и полностью избавится от PersonDTO
.Имеет ли это смысл?Является ли это жизнеспособной альтернативой определению DTO, и если нет, каковы последствия?Я не фанат необходимости управлять отдельным классом для DTO, который на самом деле является просто подмножеством свойств из исходной сущности в таблицах Azure.
public static (string, string) GetValues(this Person p)
{
return (p.SomeValue1, p.SomeValue2);
}
Вызывается так:
Person person = new Person("Frank", "Rizzo")
{
person.SomeValue1 = "Value1",
person.SomeValue2 = "Value2"
};
var (personValue1, personValue2) = person.GetValues();
Обновление: Похоже, альтернатива использует перегрузки с именем Deconstruct
без необходимости использования метода расширения следующим образом:
public void Deconstruct(out someValue1, out someValue2)
{
someValue1 = SomeValue1;
someValue2 = SomeValue2;
}
Вызывается так:
Person p = new Person("Frank", "Rizzo")
{
SomeValue1 = "Value1",
SomeValue2 = "Value2"
};
var (someValue1, someValue2) = p;
Синтаксис может быть немного выше (запись из памяти, а не фактический пример рабочего кода).