【问题标题】:How to simply map an NHibernate ISet to IList using AutoMapper如何使用 AutoMapper 简单地将 NHibernate ISet 映射到 IList
【发布时间】:2010-12-14 18:14:43
【问题描述】:

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

My Domain 对象如下:

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 可以翻译成领域模型并持久化。

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

再次感谢您的帮助。

【问题讨论】:

  • 您的自动映射器配置是...?
  • 映射仅针对单个项目定义: Mapper.CreateMap(); Mapper.CreateMap();不确定我将如何为 Set 创建映射,这是问题的基本前提。感谢您的帮助。
  • 我确实尝试过 Mapper.CreateMap() 并以异常结束
  • 标题怎么了?并没有真正反映问题,是吗?

标签: nhibernate mapping automapper


【解决方案1】:

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

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

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

【讨论】:

  • 遇到了同样的问题:一个简单的 ISet。我的 DTO 中的值是空的(null),因此我认为他制作了一个 IList。抱着很大的希望,我尝试了上面的代码行,但这里仍然给出了同样的错误。
【解决方案2】:

答案:

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

一些备注:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多