簡體   English   中英

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

[英]How do i map my model and dto using this particular mapper?

我正在嘗試映射 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 函數。 我無法讓它工作。

如果我理解你想要做什么,你也需要一個列表的映射器,然后為該類中的對象調用映射器:

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;  
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM