Обработка зависимостей в профиле Automapper - PullRequest
0 голосов
/ 21 марта 2019

У меня есть следующее сопоставление продукта, которое вызовет зависимость (UpdateProduct в ProductMapService) для выполнения сопоставления с дочерними сущностями продукта после первоначального сопоставления.Однако, когда я выполняю процесс отображения, я получаю исключение (для этого объекта не определен конструктор без параметров).

Я не уверен, что это лучший способ внедрить зависимость в профильучебный класс.Кто-нибудь может посоветовать мне это?

Профиль продукта Automapper:

namespace MyAPI.Mappers
{
public class ProductProfiles: Profile
{
    private readonly IProductMapService _productMap;
    public ProductProfiles(IProductMapService productMap)
    {
        _productMap = productMap;

        CreateMap<ProductForCreationDto, Product>();

        CreateMap<ProductForUpdateDto, Product>()
            .ForMember(p => p.VariOptions, opt => opt.Ignore())
            .AfterMap((pDto, p) => _productMap.UpdateProduct(pDto, p));
    }
}
}

ProductService.cs:

namespace MyAPI.Services
{
public class ProductMapService: IProductMapService
{
    private readonly IMapper _mapper;
    public ProductMapService(IMapper mapper)
    {
        _mapper = mapper;

    }
    public void UpdateProduct(ProductForUpdateDto productForUpdateDto, Product productFromRepo)
    {

         foreach (var variOptionDto in productForUpdateDto.VariOptions)
        {
            if(variOptionDto.Id == 0)
            {
                productFromRepo.VariOptions.Add(Mapper.Map<VariOption>(variOptionDto));
            }
            else
            {
                _mapper.Map(variOptionDto, productFromRepo.VariOptions.SingleOrDefault(vo => vo.Id == variOptionDto.Id));
            }

            foreach (var variOptionTwoDto in variOptionDto.VariOptionTwos)
            {
                if(variOptionTwoDto.Id == 0)
                {
                    productFromRepo.VariOptions.FirstOrDefault(vo => vo.Id == variOptionDto.Id).VariOptionTwos.Add(Mapper.Map<VariOptionTwo>(variOptionTwoDto));
                }
                else
                {
                    _mapper.Map(variOptionTwoDto, productFromRepo.VariOptions.FirstOrDefault(vo => vo.Id == variOptionDto.Id).VariOptionTwos.SingleOrDefault(vot => vot.Id == variOptionTwoDto.Id));
                }
            }
        }
    }
}

}

и в файле Startup.cs:

services.AddAutoMapper();
services.AddSingleton<IProductMapService, ProductMapService>();

1 Ответ

1 голос
/ 22 марта 2019

Я последовал за документом, опубликованным Люцианом, и создал IMappingAction.

namespace PortalestAPI.Mappers.MappingActions
{
public class ProductVariationTwoUpdateAction: IMappingAction<VariOptionForUpdateDto, VariOption>
{
    private readonly IProductMapService _productMapService;     

    public ProductVariationTwoUpdateAction(IProductMapService productMapService)
    {
        _productMapService = productMapService;
    }  

    public void Process(VariOptionForUpdateDto variOptionForUpdateDto, VariOption variOption)
    {
        _productMapService.UpdateVariationTwo(variOptionForUpdateDto, variOption);
    }
}
}
...