У меня есть родительские и дочерние объекты, которые являются производными от сущностей LINQ to SQL. Я хочу сопоставить их с некоторыми DTO, дружественными к домену. Мои классы сущностей SQL выглядят примерно так:
public class SqlEntityParent
{
public int ParentId { get; set; }
public string Name { get; set; }
public EntitySet<SqlEntityChild> Children { get; set; }
}
public class SqlEntityChild
{
public int ChildId { get; set; }
public int ParentId { get; set; }
public int Position { get; set; }
public string CategoryName { get; set; }
public string CategoryValue { get; set; }
}
В этой модели это стандартное соотношение один-ко-многим между SqlEntityParent
и SqlEntityChild
. Некоторые репрезентативные данные будут ...
Родитель:
ParentId Name
-------- -------
1 Parent1
Ребенок:
ChildId ParentId Position CategoryName CategoryValue
------- -------- -------- ------------ -------------
1 1 1 Contents Things
2 1 1 Group GroupOne
3 1 2 Contents Things
4 1 2 Group GroupTwo
Теперь я хочу отобразить эти данные в мои доменные объекты, которые выглядят примерно так:
public class DomainParent
{
public int ParentId { get; set; }
public string Name { get; set; }
public List<DomainChild> Children { get; set; }
}
public class DomainChild
{
public int Position { get; set; }
public string Contents { get; set; }
public string Group { get; set; }
}
В этой структуре один объект DomainChild
состоит из данных двух объектов SqlEntityChild
, а группировка определяется значением Position
дочернего объекта. Таким образом, эти примеры данных представляют один объект DomainParent
со списком из двух DomainChild
объектов. Первый дочерний элемент должен иметь значение Position
, равное 1, значение Contents
, равное «Вещи», и значение Group
, равное «GroupOne». Второй ребенок должен иметь Position
из 2, Contents
из «Вещи» и Group
из «GroupTwo».
Мне удобно настраивать индивидуальное сопоставление в AutoMapper с помощью ValueResolvers, но я не уверен, как лучше всего справиться с этим. Я создал описанный ниже преобразователь и связанное с ним сопоставление для родительских сущностей, которое отображает весь список дочерних сущностей за один проход, но это кажется глупым, потому что мне нужно вручную выполнить полное сопоставление дочерних объектов в этом классе решателя.
Mapper.CreateMap<SqlEntityParent, DomainParent>()
.ForMember(dto => dto.Children, opt => opt.ResolveUsing<MyResolver>());
public class MyResolver: ValueResolver<SqlEntityParent, List<DomainChild>>
{
private MyDataContext db;
public MyResolver()
{
db = new MyDataContext();
}
protected override List<DomainChild> ResolveCore(SqlEntityParent source)
{
// In here:
// 1. custom LINQ queries
// 2. manual creation of DomainChild objects
// 3. manual mapping of SqlEntityChild to DomainChild
}
}
Итак, мой главный вопрос таков: это лучшее, что я могу сделать с AutoMapper в этой ситуации, или есть какой-то другой более эффективный метод, который я могу использовать?