Вопрос касательно маппинга в 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;
    }
}

Знаю что делаю неправильно, поэтому хотел бы узнать, как поступать в таких ситуациях.


Ответы (0 шт):