2

我正在尝试使用 AutoMapper 从 DTO 映射到我的域。

我的 DTO 可能如下所示:

public class MyDTO
{
    public string Name { get; set; }
    public bool OtherProperty { get; set; }

    public ChildDTO[] Children { get; set;}
}

public class ChildDTO
{
    public string OtherName { get; set; }
}

我的域对象是这样的:

public class MyDomain
{
    public string Name { get; set; }
    public bool OtherProperty { get; set; }
    public ISet<ChildDomain> Children { get; set; }
}

public class ChildDomain
{
    public string OtherName { get; set; }
}

我将如何设置 AutoMapper 以便能够从这些 Array 映射到 Set。似乎 AutoMapper 正在获取数组并将它们转换为 IList,然后在转换为 ISet 时失败。

这是例外

Unable to cast object of type 'System.Collections.Generic.List`1[DataTranser.ChildDTO]' to type 'Iesi.Collections.Generic.ISet`1[Domain.ChildDomain]'.

我希望找到一种简单的通用方法来执行此操作,以便我可以最小化从 DTO 映射到域所需的基础设施。任何帮助是极大的赞赏。



更新:
那么我将如何建模 MyDomain -> ChildDomain 而不会以贫血的域模型结束?我知道如果没有 MyDomain 或 ChildDomain 中的业务逻辑,域模型目前是贫乏的,但我们的目标是在我们前进的过程中添加业务逻辑。我只是想确保我的 View Model 可以翻译成领域模型并持久化。

从视图和域之间的简单映射到后来添加业务规则,您对这个场景有什么建议?

再次感谢你的帮助。

4

2 回答 2

4

如果您的持久层很简单,使用 UseDestinationValue() 将告诉 AutoMapper 不要替换底层集合:

ForMember(dest => dest.Children, opt => opt.UseDestinationValue())

但是,如果它不简单,我们只需手动将更新返回到域中。更新域模型的逻辑通常会变得更加复杂。进行反向映射会对域模型的形状施加约束,这可能是您不想要的。

于 2009-11-10T14:57:08.400 回答
1

答案:

  1. 您必须创建自己的 IObjectMapper 来映射像 ISet 这样的自定义集合
  2. 使用所有标准 objectmapper 和新的 setobjectmapper 创建您自己的配置实例。
  3. 使用使用您自己的 objectmapper 而不是静态 AutoMapper.Mapper 类的配置创建的 IMappingEngine 实例。

一些备注:

  • 在控制反转容器中配置 IMappingEngine 结构很容易。
  • automapper 本身的源代码可能会帮助您创建 IObjectMapper 实现。
  • 您正在以相反的方式使用 automapper 来实现它的设计目的:它旨在将复杂对象映射到简单对象。您尝试将一个简单的 DTO 映射到一个复杂的实体。(这并不意味着你想要的东西很难用 automapper 做,但你将来可能会遇到不同的问题)
  • 您正在使用贫血域模型反模式。域应该包含所有的业务逻辑,所以它不应该暴露像 ISet 这样的复杂集合(并且根本没有集合的公共设置器)
于 2009-11-09T20:36:53.713 回答