Я пытался придумать чистый и многоразовый способ сопоставления объектов с их DTO. Вот пример того, что я придумал, и где я застрял.
Объекты
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
// Other properties not included in DTO
}
public class Address
{
public int ID { get; set; }
public string City { get; set; }
// Other properties not included in DTO
}
DTOS
public class PersonDTO
{
public int ID { get; set; }
public string Name { get; set; }
public AddressDTO Address { get; set; }
}
public class AddressDTO
{
public int ID { get; set; }
public string City { get; set; }
}
Выражения
Вот как я начал обрабатывать отображение. Мне нужно решение, которое не будет выполнять запрос перед сопоставлением. Мне сказали, что если вы передадите Func<in, out>
вместо Expression<Func<in, out>>
, он выполнит запрос перед сопоставлением.
public static Expressions
{
public static Expression<Func<Person, PersonDTO>> = (person) => new PersonDTO()
{
ID = person.ID,
Name = person.Name,
Address = new AddressDTO()
{
ID = person.Address.ID,
City = person.Address.City
}
}
}
Одна из проблем заключается в том, что у меня уже есть выражение, которое отображает Address
в AddressDTO
, поэтому у меня есть дублированный код. Это также будет нарушено, если person.Address
равно null. Это очень неприятно, особенно если я хочу отображать другие объекты, связанные с человеком в этом же DTO. Он становится гнездом птиц вложенных отображений.
Я пробовал следующее, но Linq не знает, как его обрабатывать.
public static Expressions
{
public static Expression<Func<Person, PersonDTO>> = (person) => new PersonDTO()
{
ID = person.ID,
Name = person.Name,
Address = Convert(person.Address)
}
public static AddressDTO Convert(Address source)
{
if (source == null) return null;
return new AddressDTO()
{
ID = source.ID,
City = source.City
}
}
}
Есть ли какие-то элегантные решения, которые мне не хватает?