如何在.NET CORE中管理Rest-Api的DTO实现?备择方案?

时间:2018-09-25 13:41:29

标签: rest asp.net-web-api .net-core automapper dto

我在WebApi中有一个很大的查询,该查询会过滤来自不同模型的数据,然后将它们以DTO对象的形式发送到FrontEnd(Angular)。

我认为DTO可能是正确的方法,因为前端不必从所有模型中获取所有参数。
我的问题在于将DTO对象映射回我的WebApi模型。 我从NugetPackages尝试了Automapper,但是没有用。我还听说当项目越来越大时,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那样使* ss感到痛苦。

我愿意尝试解决类似问题的新想法或模式。

先谢谢了;)

1 个答案:

答案 0 :(得分:0)

当您拥有有效的代码时,这个问题可能会结束,但是在多年尝试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,
        ...
    };
}

希望有帮助。