Объекты моей базы данных выглядят следующим образом (отредактированы до соответствующей информации):
public class Task
{
public Guid? StatusId { get; set; }
public Status Status { get; set; }
public DateTime? StatusLastModified { get; set; }
}
public class Status
{
public string Name { get; set; }
// several other properties redacted
}
Задачи изначально не имеют статуса (StatusLastModified тогда также имеет значение null), и как только первый статус был назначен, задачи будут всегда иметь статус (и StatusLastModified тогда также не нуль).
Ради этого вопроса вы можете предположить, что эти свойства всегда будут как нулевыми, так и ненулевыми, мне не нужно учитывать аномалии, когда одно равно нулю, а другое нет.
Для моих DTO, я хочу сопоставить это со следующей структурой:
public struct TaskDto
{
public TaskStatusDto? Status { get; set; }
}
public struct TaskStatusDto
{
public DateTime Timestamp { get; set; } // maps from Task.StatusLastModified
public StatusDto Status { get; set; } // maps from Task.Status
}
public struct StatusDto
{
public string Name { get; set; }
// and all the other properties from the Status entity
}
Цель в том, чтобы мой TaskDto
имел базовый TaskStatusDto
только при наличии фактического статуса и в противном случае он должен быть нулевым. Это полезно, поскольку устраняет необходимость постоянно проверять и объект состояния, и дату последнего изменения.
Однако я пытаюсь настроить это отображение в Automapper. Я создал отображение между Status
и StatusDto
:
configuration
.CreateMap<Status, StatusDto>();
Мое реальное отображение более сложное, но также доказано, что оно работает, поэтому можно предположить, что это действительное и рабочее отображение.
Проблема, с которой я столкнулся, заключается в том, как я могу ссылаться на это отображение при создании настраиваемого отображения между Task
и TaskDto
. В настоящее время я пробовал следующее:
configuration
.CreateMap<Task, TaskDto>()
.ForMember(
dto => dto.Status,
opt => opt.MapFrom(entity =>
entity.Status == null
? null as TaskStatusDto?
: new TaskStatusDto()
{
TimeStamp = entity.StatusLastModified.Value,
Status = // ??? make me a StatusDto from entity.Status
}
));
Часть, которую я не знаю, как заполнить, это комментарий. У меня есть доступ к исходной сущности (entity.Status
), но я не знаю, как сказать Automapper преобразовать этот объект в StatusDto
в соответствии с отображением, которое он должен уже знать.
Мой подход также кажется более надуманным, чем должно быть, но я не знаю, как иначе представить этот промежуточный TaskStatusDto
объект, если он не поддерживается реальной сущностью в моих исходных данных.
A небольшая сноска, неуверен, если уместно: я использую Heroi c .Automapper , что означает, что карты TaskDto
и StatusDto
настраиваются в отдельных местах (то есть внутри TaskDto
и * Класс 1042 *, соответственно) и платформа Heroi c объединит все эти карты во время выполнения.
public class TaskDto : IMapFrom<Task>, IHaveCustomMappings
{
public void CreateMappings(IMapperConfigurationExpression configuration)
{
// mapping from Task to TaskDto
}
}
public class StatusDto : IMapFrom<Status>, IHaveCustomMappings
{
public void CreateMappings(IMapperConfigurationExpression configuration)
{
// mapping from Status to StatusDto
}
}
Однако, насколько я понимаю, настройка самой карты - не Heroi c -specifi c и должен иметь только синтаксис Automapper.