gpt4 book ai didi

collections - AutoMapper 在映射子对象时传递父引用

转载 作者:行者123 更新时间:2023-12-04 14:34:25 25 4
gpt4 key购买 nike

我正在尝试使用 AutoMapper 将从 Web 服务接收到的一些 DTO(数据契约(Contract))对象映射到我的业务对象中。根 DTO 对象包含子对象的集合。我的业务对象还有一个子业务对象的子集合。为了让 AutoMapper 工作,我必须在我的业务对象的集合属性上包含一个 setter,否则集合将始终为空。此外,我必须为集合类型添加一个默认构造函数。因此,在我看来 AutoMapper 正在实例化一个新的集合对象,填充它并设置为我的业务对象的集合属性。

虽然这一切都很好,但我有额外的逻辑必须在创建集合时连接起来,并且默认构造函数违背了目的。从本质上讲,我正在建立亲子关系并连接一些事件,以便它们从 child 传到 parent 。

我想要做的是让 AutoMapper 简单地将 DTO 集合中的子对象映射到我的 BO 上的现有集合。换句话说,跳过创建新集合,只需使用业务对象已有的集合。

有什么方法可以轻松实现这一点?!?!?

更新

也许更好的问题和更简单的解决方案是,是否可以定义 AutoMapper 在实例化时传递给集合的参数?我的子集合定义如下:

public class ChildCollection : Collection<ChildObjects>
{
public ChildCollection(ParentObject parent) { Parent = parent; }
}

如果我可以将 AutoMapper 配置为使用此构造函数并传入正确的对象,那就太完美了!

另一个更新

为了清楚起见,这里是问题空间中的其他类:

public class ParentObject
{
private ChildCollection _children;

public ChildCollection Children
{
get
{
if (_children == null) _children = new ChildCollection(this);

return _children;
}
}
}

public class ParentDTO
{
public ICollection<ChildDTO> Children { get; set; }
}

public class ChildDTO
{
public String SomeProperty { get; set; }
}

我这样配置 AutoMapper:

Mapper.CreateMap<ParentDTO, ParentObject>();
Mapper.CreateMap<ChildDTO, ChildObject>();

这样做,我必须向 ParentObject 中的 Children 属性添加一个 setter,并向 ChildCollection 添加一个默认(无参数)构造函数。虽然我可以解决定义父子关系的需要,但在创建子集合时,期望 AutoMapper 支持配置映射以使用特定的构造函数似乎是合乎逻辑的。像这样的东西:

Mapper.CreateMap<ParentDTO, ParentObject>()
.ForMember(obj => obj.Children, opt.MapFrom(dto => dto.Children))
.ConstructUsing(col => new ChildCollection(obj));

请注意,我正在传递对“obj”的引用,它是被映射的 ParentObject 实例。

最佳答案

事实证明,答案一直都在。 UseDestinationValue 选项正是我想要的。

此选项指示 AutoMapper 使用目标对象上的现有属性并将任何子属性或集合项映射到该对象中,而不是创建新的代理对象。

所以,这就是我在我的应用程序中要做的所有事情:

Mapper.CreateMap<ParentDTO, ParentObject>()
.ForMember(obj => obj.Children,
opt.UseDestinationValue());

而且,瞧!现在,我可以使用父引用实例化子集合,并在将每个项添加到集合时将引用设置回对父项的引用。

关于collections - AutoMapper 在映射子对象时传递父引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com