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

标签 collections automapper parent-child

我正在尝试使用 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/

相关文章:

collections - 使用 jekyll/liquid 如何获取 yaml 哈希的所有键

c# - 集合类型名称中的 '1 是什么

entity-framework - 使用 Automapper 实现多对多到 DTO

java - 用于父/子关系和 DAO/DTO 模式的 Hibernate GenericDAO

perl - 如何在 perl 中的 fork 之间共享简单标量(计数器变量)?

ios - 如何动态添加swift字典中的值

Java 相当于 C++ std::map?

c# - MVC 传递模型与 View 模型 - 如何保留模型元信息?

c# - Slapper & Dapper 词典支持

elasticsearch - 如何存储有关用户已阅读哪些通知的信息?