Вопрос касательно маппинга в Automapper
Такая ситуация, есть определенные модели, и у этих моделей есть их Dto модели. Например:
public class Group
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public Coach Coach { get; set; }
public int CoachId { get; set; }
public List<PurchasedSubscription> PurchasedSubscriptions { get; set; }
}
public class GetGroupDto
{
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
}
Что если у меня есть модель A и B. В модели B есть свойство типа A. У модели A так же есть ее Dto модель ADto. Я хочу сделать маппинг модели B в ее Dto модель BDto, но только чтобы вместо свойства типа A было свойство типа ADto в модели BDto. Выше я описал модель Group, она в этой ситуации выступает в роли ADto. Вот есть модель PurchasedSubscription и ее Dto модель GetPurchasedSubscriptionDto.
public class PurchasedSubscription
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public Subscription Subscription { get; set; }
public int SubscriptionId { get; set; }
public Client Client { get; set; }
public int ClientId { get; set; }
public Group Group { get; set; }
public int? GroupId { get; set; }
}
public class GetPurchasedSubscriptionDto
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public GetSubscriptionDto OunSubscription { get; set; } = new();
public GetGroupDto OunGroup { get; set; } = new();
}
То есть мне нужно сделать маппинг PurchasedSubscription в GetPurchasedSubscription, но при этом чтобы вместо Group было GetGroupDto. То есть как бы маппинг, внутри которого еще маппинг. Пока что я сделал так:
public class GroupProfile : Profile
{
public GroupProfile()
{
CreateMap<Group, GetGroupDto>();
}
}
public class PurchasedSubscriptionProfile : Profile
{
public PurchasedSubscriptionProfile()
{
CreateMap<BuySubscriptionDto, PurchasedSubscription>();
CreateMap<PurchasedSubscription, GetPurchasedSubscriptionDto>();
}
}
А в самом методе:
public async Task<ResponseAPI<GetPurchasedSubscriptionDto>> BuySubscription(BuySubscriptionDto request)
{
var response = new ResponseAPI<GetPurchasedSubscriptionDto>();
var userId = int.Parse(_httpContextAccessor.HttpContext!.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier)!.Value);
try
{
var purchasedSub = _mapper.Map<PurchasedSubscription>(request);
var subType = await _subRepository.GetById(request.SubscriptionId);
if (subType!.Duration == "month")
purchasedSub.EndDate = purchasedSub.StartDate + TimeSpan.FromDays(30);
else
purchasedSub.EndDate = DateTime.Now;
purchasedSub.ClientId = userId;
await _purSubRepository.Create(purchasedSub);
response.Data = _mapper.Map<GetPurchasedSubscriptionDto>(purchasedSub);
response.Data.OunSubscription = _mapper.Map<GetSubscriptionDto>(purchasedSub.Subscription);
response.Data.OunGroup = _mapper.Map<GetGroupDto>(purchasedSub.Group);
return response;
}
catch (Exception ex)
{
response.Data = null;
response.Success = false;
response.Message = ex.Message;
return response;
}
}
Знаю что делаю неправильно, поэтому хотел бы узнать, как поступать в таких ситуациях.