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

2024-02-28

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

虽然这一切都很好,但在创建集合时必须连接额外的逻辑,并且使用默认构造函数无法达到目的。本质上,我正在建立父子关系并连接一些事件,以便它们从子项传递到父项。

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

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

UPDATE

也许一个更好的问题和更简单的解决方案是,是否可以定义 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));

请注意,我传递了对“object”的引用,它是正在映射的父对象实例。


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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AutoMapper 在映射子对象时传递父引用 的相关文章

随机推荐

  • Magento V1.7 网格视图 - 添加制造商属性以查看

    On 这一页 http www foxtrotgear com index php tactical gear equipment html mode grid我想在商品名称的正下方添加制造商名称 但似乎无法使其正常工作 尝试了很多建议 但
  • 阿格达。冒号之前/之后的参数

    定义数据类型时 我可以在冒号之前 传递 一些参数 data Image A B Set f A B B Set where im f A B x A Image f f x 但出于未知原因 我似乎无法在函数声明中执行此操作 exIm A B
  • MySQL:在同一个 MySql 实例上克隆 MySQL 数据库

    我想编写一个复制当前数据库的脚本sitedb1 to sitedb2在同一个 mysql 数据库实例上 我知道我可以将 sitedb1 转储到 sql 脚本 mysqldump u root p sitedb1 gt db name sql
  • 文本渲染器。如何使用尾省略号渲染多行文本?

    我如何呈现这样的文本 简单列表视图 尝试这样的代码不会出现省略号 TextRenderer DrawText listGraphics anItem Text GetItemFont anItem textRec Color FromKno
  • Java代码中如何标记忽略返回值?

    C 约定标记该函数仅因副作用而调用 并且在这个特定的调用中我们对返回值不感兴趣 void getSomethingAndDoAction Java中有类似的东西吗 The 容易出错的项目 https errorprone info has
  • 将音频输出重定向到手机扬声器,将麦克风输入重定向到耳机

    是否可以将音频输出重定向到手机扬声器并仍然使用麦克风耳机输入 如果我将音频路由重定向到手机扬声器而不是耳机 它也会重定向麦克风 这是有道理的 但我似乎不能仅仅重定向麦克风输入 有任何想法吗 这是我用来将音频重定向到扬声器的代码 UInt32
  • 在Xamarin中动态添加入口控件

    我想获取XML 输入控制 from API 可用于JSON Entry 控件的所有属性均采用 JSON 格式 我想将它们添加到 xml页面并获取它们的值 当用户进入应用程序时 ViewModel 通过数据绑定 UPDATE 根据答案更新代码
  • 如何自定义 Eclipse 的 getter 和 setter 生成?

    如何配置 Eclipse 来生成带有参数变量前缀的 getter 和 setter Example private String someVariable public void setSomeVariable String aSomeVa
  • 有没有适用于 Android 传真的本机应用程序?

    我想开发一个传真应用程序 我在谷歌上搜索并找到了一些链接 用于在android上开发传真应用程序的应用程序 但是我想使用android的本机应用程序开发应用程序 在一些网站上 我读到免费的网络服务可用于发送 使用Android移动应用程序接
  • Rcpp 公开类的序列化

    我在 R 包中编写了一个 C 类 并将其暴露给 R 命名空间RCPP EXPOSED CLASS and RCPP MODULE 一切都很好 gt index An object of class Index Slot index C ob
  • 我使用 PyPy 是否错误?它比标准 Python 慢 10 倍

    我听说过有关 PyPy 的好消息 特别是我听说它非常快 这让我想知道它是否可用于我的嵌入式项目 我下载了PyPy 2 6 for my Windows 7PC 并将内容解压到一个目录中 我编写了一个小型测试程序来进行基准测试 import
  • 有关电话号码的信息

    node js 是否有任何库可以接收电话号码 任何格式 将其转换为默认格式 并告诉我有关该号码的信息 例如 国家 地区 城市等 我不知道 我也搜索过npm 注册表 http search npmjs org 谷歌有库电话号码 http co
  • 如何将左右系统键发送到SendKeys.Send()?

    我主要研究了几个选项 Sendkeys Send 用于右 alt 键 有什么替代方案吗 https stackoverflow com questions 9330498 sendkeys send for right alt key an
  • 我想在所有内容图像上应用 css class(bootstrap) .img-responsive

    我正在 bootstrap 的帮助下开发一个 Wordpress 主题 因此我手动将案例应用于所有内容图像 如下所示 img src images logo 03 png class img responsive 有没有办法自动应用相同的类
  • std::function 复制参数?

    My code include
  • C++中如何设计一个可以容纳任意类型函数的容器?

    我希望服务器支持注册任何功能 可能是这样的 server register Add int a int b cout lt lt a b lt lt endl server register Echo string str cout lt
  • 通过 Facebook 分享 Android 果冻豆的意图

    我想通过 Facebook 分享 Android jelly bean 的一些图像和文本 它适用于除 Android 果冻豆之外的所有设备 任何人请帮助我如何解决这个问题 my code Intent shareIntent new Int
  • ASPX 页面中“当前上下文中不存在该名称”

    我看过类似的问题 1 https stackoverflow com questions 706603 the name controlname does not exist in the current context 2 https s
  • URL 的编码参数

    我有一个正在构建 URL 的 Silverlight 应用程序 此 URL 是对基于 REST 的服务的调用 该服务需要一个代表位置的参数 位置的形式为 城市 州 为了构建此 URL 我调用以下代码 string url http www
  • AutoMapper 在映射子对象时传递父引用

    我正在尝试使用 AutoMapper 将从 Web 服务接收到的一些 DTO 数据契约 对象映射到我的业务对象中 根 DTO 对象包含子对象的集合 我的业务对象还有一个子业务对象的子集合 为了让 AutoMapper 工作 我必须在业务对象