如何使用AutoMapper简单地将NHibernate ISet映射到IList

时间:2009-11-09 19:20:02

标签: nhibernate mapping automapper

我正在尝试使用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正在使用Array并将它们转换为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 - &gt; ChildDomain没有结束贫血领域模型?我知道,如果没有MyDomain或ChildDomain中的业务逻辑,域模型目前仍然很贫乏,但目标是在我们前进的过程中添加业务逻辑。我只是想确保我的视图模型可以转换为域模型并保持不变。

您对此方案有何建议,从视图和域之间的简单映射转移以及稍后添加业务规则?

再次感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

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

ForMember(dest =&gt; dest.Children,opt =&gt; opt.UseDestinationValue())

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

答案 1 :(得分:1)

答案:

  1. 您必须创建自己的IObjectMapper来映射自定义集合,如ISet
  2. 使用所有标准创建您自己的配置实例 objectmappers和你的新人 setobjectmapper。
  3. 使用通过配置创建的IMappingEngine实例 你自己的objectmapper而不是 静态AutoMapper.Mapper类。
  4. 一些评论:

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