rest - 如何在 .NET CORE 中管理 Rest-Api 的 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 中的一个痛苦,就像在我的例子中一样。
我对我还不知道的新想法或模式持开放态度,以尝试管理此类问题。
提前致谢 ;)
解决方案
这个问题可能会因为你有工作代码而被关闭,但我的建议是,在多年尝试 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,
...
};
}
希望有帮助。
推荐阅读
- typescript - 反应原生 Typescript Touchableopacity 道具错误
- javascript - Fabric js 对象在所有屏幕上都有响应
- amazon-web-services - 如何使用结构化模式在 AWS CloudSearch 上搜索子字符串
- json - 尝试将自定义有效负载消息传递给 sqs - kinesis 完成后的死信队列在 lambda 中重试 3 次
- java - 编辑 Liquibase ChangeLog 以在运行时包含新的变更集文件
- visual-studio-code - 为什么我的一些扩展在 VS Code 1.57 中不起作用?
- python - 在我的命令上发送消息的不和谐机器人
- python - 如何用元组迭代列表并将其用作python字典中的键、值
- api - 将 G Suite 用户检索为不属于任何组的成员
- python - 我正在为另一个专栏做,但没有得到任何年的消费税