我在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感到痛苦。
我愿意尝试解决类似问题的新想法或模式。
先谢谢了;)
答案 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,
...
};
}
希望有帮助。