- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在映射回 DTO 时遇到问题。
DTO:
public class ServiceEntity : BaseChild
{
public int Id { get; set; }
}
public class BaseChild
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Salary { get; set; }
public string BkName { get; set; }
public int BkPrice { get; set; }
public string BkDescription { get; set; }
}
View 模型:
public class BusinessEntity
{
public ChildBussiness Details { get; set; }
}
public class ChildBussiness
{
public string NameFirst { get; set; }
public string LastName { get; set; }
public Books BookDetails { get; set; }
public string Salary { get; set; }
}
public class Books
{
public string BookName { get; set; }
public int BookPrice { get; set; }
public string BookDescription { get; set; }
}
Controller
对于从 DTO 到 ViewModel 的映射,我使用以下代码,它工作正常。
public ActionResult Index()
{
ServiceEntity obj = GetData();
Mapper.CreateMap<ServiceEntity, BusinessEntity>()
.ForMember(d => d.Details, o => o.MapFrom(x => new ChildBussiness { NameFirst = x.FirstName, LastName = x.LastName, Salary = x.Salary.ToString(), BookDetails = new Books { BookDescription = x.BkDescription, BookName = x.BkName, BookPrice = x.BkPrice }}));
BusinessEntity objDetails = Mapper.Map<ServiceEntity, BusinessEntity>(obj);
}
虽然转换回来我做不到。下面是我试过的代码。
.
.
.
ServiceEntity objser = new ServiceEntity();
Mapper.CreateMap<BusinessEntity, ServiceEntity>();
Mapper.CreateMap<Books, ServiceEntity>();
objser = Mapper.Map<BusinessEntity, ServiceEntity>(model);
.
.
.
但我没有取得任何成功。例如,我提供了一些属性。我实时我可能拥有超过 30 个属性(property)。任何建议将不胜感激...
最佳答案
编辑 因此,您可以更改 BusinessEntity
实现,您可以使用 AutoMapper 约定和扁平化的强大功能。这是修改后的业务实体:
public class BusinessEntity
{
public string FirstName { get; set; } // Instead of NameFirst
public string LastName { get; set; }
public Book Bk { get; set; } // Bk instead of BookDetails
public string Salary { get; set; }
}
public class Book
{
public string Name { get; set; } // No prefixes
public int Price { get; set; }
public string Description { get; set; }
}
您需要 Bk
名称以允许将 Bk.Name
扁平化为 BkName
。现在所有映射都将在几行中生成:
// For mapping from service entity to book
Mapper.Initialize(cfg => cfg.RecognizePrefixes("Bk"));
Mapper.CreateMap<BusinessEntity, ServiceEntity>();
// Trick to un-flatten service entity
// It is mapped both to Book and BusinessEnity
Mapper.CreateMap<ServiceEntity, Book>();
Mapper.CreateMap<ServiceEntity, BusinessEntity>()
.ForMember(d => d.Bk, m => m.MapFrom(s => s));
就是这样。所有 30 个属性都将按照约定进行映射:
var service = new ServiceEntity {
FirstName = "Sergey",
LastName = "Berezovskiy",
Salary = 5000,
BkName = "Laziness in Action",
BkDescription = "...",
BkPrice = 42
};
var business = Mapper.Map<BusinessEntity>(source);
var anotherService = Mapper.Map<ServiceEntity>(business);
原始答案 因此您正在使用自定义映射,从服务实体到业务实体,那么默认映射也不适用于向后映射。您应该手动为成员提供映射:
Mapper.CreateMap<BusinessEntity, ServiceEntity>()
.ForMember(d => d.FirstName, m => m.MapFrom(s => s.Details.NameFirst))
.ForMember(d => d.LastName, m => m.MapFrom(s => s.Details.LastName))
.ForMember(d => d.Salary, m => m.MapFrom(s => s.Details.Salary))
.ForMember(d => d.BkName, m => m.MapFrom(s => s.Details.BookDetails.BookName))
.ForMember(d => d.BkPrice, m => m.MapFrom(s => s.Details.BookDetails.BookPrice))
.ForMember(d => d.BkDescription, m => m.MapFrom(s => s.Details.BookDetails.BookDescription));
但我认为在这种情况下手动映射更好,然后为各个属性提供所有这些映射。
关于c# - 从 ViewModel 映射回 DTO 时出现 AutoMapper 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17993383/
我看到 DTO 类型在域模型中的类型内创建并在类型之间传递。这是好习惯吗? 我一直认为 DTO 主要用于上下文边界(即对象图的边缘)以解耦上下文实现(例如域/ui 边界)。 最佳答案 你的问题有点主观
我们将使用 DTO 向表示层发送数据或从表示层发送数据。我们有这样的层: 外观 应用服务 域名 我们使用 Dozer 来帮助我们将实体转换为 dto。但我现在有两个问题: 从entity到dto我们可
我对术语有疑问。根据 Fowler 的说法,DTO 是“在进程之间传输数据以减少方法调用次数的对象”。 (http://martinfowler.com/eaaCatalog/dataTransfer
我们使用 spring-boot 开发的应用程序遵循微服务架构。为了解释这个问题,让我们考虑 3 个不同的服务 A、B、C。服务 A 和 B 也使用服务 C 的一些 API。 我在项目 C(服务 C)
所以基本上我正在编写一个使用 DTO 的 API,但我在返回 DTO 内的另一个实体时遇到了问题。 这是我的 DTO: public class DirectoryDTO { String per
我尝试从方法响应正文中获取派生类字段。请求体参数是基类的类型。请求带有派生类字段,但我无法将其转换为派生类。 这是我的 Controller 方法和 DTO 类: 方法: @PostMapping(
这更多的是一个理论问题,而不是一个实际问题。 我们有一个分层架构,类似于: UI UI_JavaHandler Backend DTO1 需要比 DTO2 多一点的数据,并且恰好是一个额外的字符串
我在 Wildfly 10.1.0-Final 上使用带有 Java 8 和 Hibernate (5.0.X) 的 Java EE 7,我需要使用投影将 JPQL 查询结果加载到 DTO 中,但我找
有一个建议是transfer objects should not contain object references to other transfer objects .相反,他们应该使用其他传输
我们正在开始一个新项目并正在设计 DTO,这些 DTO 将被注入(inject)到具有行为的相应 POCO 中。然而,我能找到的每个 DTO 示例都只包含值类型,例如: public class Cu
这可能是一个一般的java问题 DTO1 属性1 属性2 属性3 DTO2 属性1 属性2 属性3 属性4 属性5 属性6 属性7 属性8 属性9 属性10 属性11 属性12 我将在屏幕上的 gxt
我在一个项目中遇到了一个问题,并在一个裸测试项目中成功地重现了它。 我有以下 dto: public class AppUserDto { public int Id { get; set;
我正在研究 RESTful API,但在为 API 提供输入的过程中遇到了一些麻烦。 假设我有一个可以像这样获取的“人”资源:api/person/{id}并返回一个这样的对象: public cla
我正在使用 DTO 构建我的第一个应用程序 - 我目前有一个 DTO 用于获取特定对象的数据,另一个不同的 DTO 用于更新(PUTting)数据 - 因为只有少数字段可以从任何客户端更新,我决定为
private void writeData(HSSFSheet sheet) { for (int i = 0; i 并动态获取 DTO 属性值?,我们在Stack Overflo
我正在尝试使用 Jackson 和 Kotlin 将 YAML 文档映射到复杂的 DTO 结构,但似乎在某处遇到了误解。 我正在解析的 YAML 文档是 item_names: - item:
这个问题在这里已经有了答案: How to efficiently create a list of objects inside of a generic method? (2 个答案) 关闭 9
我们将使用 DTO 向表示层发送数据或从表示层发送数据。 我在名为 PostAd 的服务对象上有一个方法,它发布用户输入的广告。 Ad 与另一个名为 AdValues 的对象相关联,该对象包含 Ad
我的应用程序服务中有验证逻辑,用于确定请求的操作是否成功,如果没有,原因。我质疑这是否是代码异味,因为它在应用程序服务中而不是域服务中,它围绕检查域模型是否存在、dto 中的属性是否可以为空等展开。代
我有以下域模型: public class Playlist { public long Id { get; set; } public string Title { get; set
我是一名优秀的程序员,十分优秀!