У меня часто есть Модели и Dtos, такие как:
// DTO class
public class OrderDto
{
public int Id { get; set; }
public DateTime Date { get set; }
public int ProductId { get; set; }
// ...
}
// Model class
public class Order : BaseObject
{
public DateTime Date { get set; }
public Product Product { get; set; }
// ...
}
// Model class
public class Product : BaseObject
{
// ...
}
Чтобы сопоставить мой OrderDto с классом Order, мне нужно настроить AutoMapper для этой конкретной «ассоциации», например:
CreateMap<OrderDto, Order>()
.ForMember(m => m.Product, d => d.ResolveUsing((d, m) =>
{
return m.Session.GetObjectByKey<Product>(dto.ProductId);
}))
Это довольно громоздко, чтобы сделать это для каждого случая, подобного этому.Поэтому я пытался обобщить это поведение с помощью пользовательского класса TypeConverter:
public class IntBaseObjectTypeConverter : ITypeConverter<int, BaseObject>
{
private UnitOfWork uow;
// ...
public BaseObjectConvert(int source, BaseObject destination, ResolutionContext context)
{
return uow.Session.GetObjectByKey(typeof(destination), source);
}
}
Однако, конечно, это не удастся, если назначение будет нулевым.К сожалению, ResolutionContext не дает мне никакой информации о конкретном типе свойства назначения.
Теперь мой вопрос: есть ли другой способ добиться с помощью AutoMapper того, что я хотел бы сделать?
Обратите внимание, что я не использую Entity Framework, который, конечно, решит эту проблему на уровне модели с использованием внешнего ключа и навигационных свойств.Я использую XPO от DevExpress, который не позволяет внешний ключ и навигационные свойства, как в Entity Framework.