我如何使用这个特定的映射器映射我的模型和 dto?

Posted

技术标签:

【中文标题】我如何使用这个特定的映射器映射我的模型和 dto?【英文标题】:How do i map my model and dto using this particular mapper? 【发布时间】:2019-12-14 18:47:41 【问题描述】:

我正在尝试映射 api 调用的响应。我所做的是将API调用的响应(响应是一个数组)反序列化为模型,然后使用rootobject的数据返回一个新的dto。

public class RoadStatusService : IRoadStatusService
    
        string baseURL = "blah";

        private readonly IMapToNew<Road, RoadDto> _mapper;

        public RoadStatusService()
        

        

        public RoadStatusService(IMapToNew<Road, RoadDto> mapper)
        
            _mapper = mapper;
        

        public RoadDto GetRoadStatusDetail()
        
            var road = CallApi();


            return new RoadDto
            
                DisplayName = road.Result.DisplayName,
                StatusSeverityDescription = road.Result.DisplayName,
                StatusSeverity = road.Result.DisplayName
            ;
        


        private async Task<Road> CallApi()
        
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(baseURL);

            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage Res = await client.GetAsync(baseURL);

            if (Res.IsSuccessStatusCode)
            
                var roadResponse = Res.Content.ReadAsStringAsync().Result;

                List<Road> road = JsonConvert.DeserializeObject<List<Road>>(roadResponse);


                foreach (var item in road)
                
                    return new Road
                    
                        DisplayName = item.DisplayName,
                        StatusSeverity = item.StatusSeverity,
                        StatusSeverityDescription = item.StatusSeverityDescription
                    ;
                

            

            return null;
        


    

我的问题是,如何使用映射器类将我的模型映射到我的 dto 对象而不必这样做:

    public RoadDto GetRoadStatusDetail()
    
        var road = CallApi();


        return new RoadDto
        
            DisplayName = road.Result.DisplayName,
            StatusSeverityDescription = road.Result.DisplayName,
            StatusSeverity = road.Result.DisplayName
        ;
    

我已经编写了一个映射器类和一个接口来执行此操作,但我无法让它工作:

public class RoadToRoadDtoMapper : IMapToNew<Road, RoadDto>

    public RoadDto Map(Road model)
    
        return new RoadDto
        
            DisplayName = model?.DisplayName,
            StatusSeverity = model?.StatusSeverity,
            StatusSeverityDescription = model?.StatusSeverityDescription
        ;
    

和:

public interface IMapToNew<in TIn, out TOut>

    TOut Map(TIn model);

我认为我遇到的问题是 api 调用以数组响应?我想知道我是否应该以某种方式将我的对象转换为一个列表,然后调用.Select 并使用我编写的 mapper.map 函数。但我无法让它工作。

【问题讨论】:

【参考方案1】:

如果我理解您要做什么,您还需要一个列表映射器,然后为该类中的对象调用映射器:

public class RoadListToRoadListDtoMapper : IMapToNew<List<Road>, List<RoadDto>>

    private RoadToRoadDtoMapper roadToRoadDtoMapper = new RoadToRoadDtoMapper();
    public List<RoadDto> Map(List<Road> models)
    
        var roadDtos = new List<RoadDto>();
        foreach(var road in models)
            roadDtos.Add(roadToRoadDtoMapper.Map(road));
        
        return roadDtos;  
    

【讨论】:

以上是关于我如何使用这个特定的映射器映射我的模型和 dto?的主要内容,如果未能解决你的问题,请参考以下文章

使用 elasticsearch-persistence ruby​​ 的映射器附件类型的自定义映射

如何在使用自动映射器时将属性名称的 jsonproperty 设置为 dto?

无法使用自动映射器映射内部导航属性。 EF 核心

如何使用自动映射器映射表达式<func<Entity,DTO>>

关于QtCharts中的映射器与模型的使用

有没有办法在Scalding中指定映射器的数量?