DTO между двумя классами - PullRequest
       8

DTO между двумя классами

0 голосов
/ 26 октября 2018

Так вот, это спрашивалось здесь тысячу раз, но пока мне ничего не помогло.

Проблема:

У меня есть класс, который получает данные от моего контроллера, передает эти данные в API иполучить результат.До сих пор это работало.

, но теперь я застрял, потому что я должен сделать что-то вроде этого

Контроллер -> ARequestClass -> BRequestClass -> Получать данные CientClass -> Ответ ClientClassdata -> BResultClass -> AResultClass -> Controller

Соединение между контроллером и ARequestClass работает.Соединение между BRequestClass и ClienClasst работает

, но как я могу сказать, что witch Property из ArequestClass принадлежит BRequestClass

Я пробовал AutoMapper и наблюдал и читал тоны DTO, но все они не моглипомогите мне: |

это выглядит так

public class ARequest
{
    public string AText { get; set; }
    public string AProductKey { get; set; }
    public string ASettings { get; set; }
}
public class BRequest
{
    public string BText { get; set; }
    public string BProductKey { get; set; }
    public string BSettings { get; set; }
}
public class ClientClass
{
    public BResult DoSomething(BRequest request)
    {
        client.something = $"www.anRandomApi.com/{request.BText}{request.BProductKey}{request.BSettings};
        return client;
    }
}

Я знаю, что это простая проблема, и решение должно быть очень простым, но у меня болит мозг, и мне нужна помощь

1 Ответ

0 голосов
/ 26 октября 2018

Я думаю, что, когда это возможно, лучше избегать ручного указания отображений между свойствами. Я не уверен, есть ли в вашем случае веская причина, почему это AProductKey и BProductKey, а не просто ProductKey в обоих (что AutoMapper будет обрабатывать для вас автоматически). Если проблема связана с сериализацией, лучшим подходом в ваших классах может быть использование атрибута JsonProperty для сопоставления объекта JSON с более поддерживаемым свойством в C #.

В любом случае, вы можете указать отображение для определенных свойств, используя AutoMapper (рекомендуемый способ):

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<ARequest, BRequest>()
        .ForMember(dest => dest.BText, o => o.MapFrom(src => src.AText))
        .ForMember(d => d.BProductKey, o => o.MapFrom(s => s.AProductKey))
        .ForMember(d => d.BSettings, o => o.MapFrom(s => s.ASettings));
});

Или, если вам нужен более опасный параметр, который спасает вас при сопоставлении каждого свойства по отдельности (я бы избежал этого в рабочем коде):

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<ARequest, BRequest>()
        .ForAllMembers(mo =>
        {
            var convertedName = mo.DestinationMember.Name;
            if (convertedName.StartsWith("B"))
            {
                convertedName = "A" + convertedName.Substring(1);
            }
            mo.MapFrom(convertedName);
        });
});

В качестве альтернативы, вы можете сделать это без AutoMapper, добавив в BRequest конструктор, который принимает ARequest:

public class BRequest
{
    public BRequest() { }

    public BRequest(ARequest source)
    {
        this.BText = source.AText;
        this.BProductKey = source.AProductKey;
        this.BSettings = source.ASettings;
    }

    public string BText { get; set; }
    public string BProductKey { get; set; }
    public string BSettings { get; set; }
}
...