Как управлять внедрением DTO для Rest-Api в .NET CORE?Альтернативы? - PullRequest
0 голосов
/ 25 сентября 2018

У меня в WebApi довольно большой запрос, который фильтрует данные из разных моделей для отправки их в объект DTO в FrontEnd (Angular).

Я думаю, что DTO может быть правильным подходом, потому что это не такНеобходим для интерфейса, чтобы получить все параметры от всех моделей.
Моя проблема состоит в том, чтобы сопоставить объект DTO с моими моделями WebApi.Я пробовал Automapper из NugetPackages, но он не работал.Я также слышал, что AutoMapper не является правильным выбором, когда проекты становятся все больше и больше.

Ниже приведен код для моего объекта DTO, запроса и моделей:

public class ApplicationSettingsDto
{
    public string KeyName { get; set; }
    public string Wert { get; set; }
    public string DefaultValue { get; set; }
    public string Description { get; set; }
}

Модели:

public partial class ApplicationSettings
{
    public string KeyName { get; set; }
    public string Wert { get; set; }
    public int Typ { get; set; }
    public string DisplayOrder { get; set; }
}
public partial class ApplicationSettingsDefaults
{
    public Guid Id { get; set; }
    public string KeyName { get; set; }
    public string Value { get; set; }
    public int ProduktOption { get; set; }
}
public partial class Text
{
    public string KeyName { get; set; }
    public string Sprache { get; set; }
    public string Text1 { get; set; }
    public DateTime LetzteAenderung { get; set; }
}

Запрос:

public IQueryable Description()
    {
        int produktOption = GetProduktOption();

        var query = from appl in _repositoryContext.ApplicationSettings
                  from text in _repositoryContext.Text
                  from defaults in _repositoryContext.ApplicationSettingsDefaults
                  //filter DefaultValues
                  where appl.KeyName.Equals(defaults.KeyName) && 
                  (defaults.ProduktOption.Equals(produktOption) || defaults.ProduktOption.Equals(65535))
                  //Filter TextValues
                  where EF.Functions.Like(text.KeyName, "%" + appl.KeyName) ||
                  EF.Functions.Like(text.KeyName, "%" + appl.KeyName + "$Descr")
                  where EF.Functions.Like(text.Sprache, "de-DE")
                  select new ApplicationSettingsDto()
                  {
                      KeyName = appl.KeyName,
                      Wert = appl.Wert,
                      DefaultValue = defaults.Value,
                      Description = text.Text1
                  }
                  into output orderby output.KeyName select output;
        return query;
    }

Так что этот вопрос не о детальной реализации, а только о рекомендациях по реализации DTO, потому что отображение может быть проблемой в * ss, как в моемпример.

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

Заранее спасибо;)

1 Ответ

0 голосов
/ 25 сентября 2018

Этот вопрос, скорее всего, будет закрыт, так как у вас есть рабочий код, но я рекомендую после многих лет пробовать AutoMapper, отображения на основе отражений и рукописных отображений, чтобы вы просто придерживались того, что проще и работает.

Обычно вы должны написать логику отображения для ваших DTO один раз.Код, который вы бы написали, читабелен и понятен.Когда вы перемещаете это в AutoMapper, вы в конечном итоге получаете часто не связанный и менее разборчивый фрагмент кода для чего-то очень, очень простого.

Если вам нужна логика сопоставления в другой функции, извлеките ее в отдельный метод.Если вам это нужно в отдельном классе, продвиньте эту функцию отображения в статический метод вашего DTO.

Большая часть кода моего отображения выглядит следующим образом:

// Some controller code
da.GetStudents().Select(Map); // Map is the function below

В контроллере определен следующий метод:

public StudentDto Map(Student student)
{
    if (student == null) return null;

    return new StudentDto
    {
        FirstName = student.FirstName,
        ...
    };
}

Надеюсь, это поможет.

...