0

好的,所以我现在有一个问题,要么是 AutoMapper,要么是我的 NHibernate 查询或域/DTO 设计。

我遇到的问题是,当我进行提取时,例如 ObjectA 包含 ObjectB 的列表,而 ObjectB 具有其父 ObjectA 的属性。当我有一个对我的 ObjectA 的 ObjectB 属性进行急切获取的查询时,我可以无限地继续 ABAbABAB 等等。

这意味着当我尝试将域对象映射到包含相同交易的 DTOA 时,DTOA 具有 DTOB 列表,而 DTOB 具有其父 DTOA 的属性。我的服务在返回时超时,因为我相信我正在使用 AutoMapper 将 DomainA 映射到 DTOA,然后因为 DTOA.DTOB.DTOA.DTOB 等填充了它的无限序列化。

无论如何,我确信这是一个古老的经典问题的最佳解决方案,但我正在努力寻找正确的东西来输入我的老朋友谷歌。我可以让 AutoMapper 忽略子实例中的父实例吗,即使我认为如果我可以让 Nhibernate 获取列表但在父属性上保留一个代理,我最好。最糟糕的解决方案是使用特定场景或特殊逻辑的对象更改域对象。

任何帮助表示感谢。

编辑 - 代码

映射代码

 Mapper.CreateMap<DTOA, DomainA>();
        Mapper.CreateMap<DomainA, DTOA>()
            .ForMember(dst => dst.AProperty,
                       opts =>
                       opts.ResolveUsing<LazyLoadResolver>().FromMember(src => src.AProperty));

域对象 DomainA

 /// <summary>
    /// Data Transfer Object, object representing a user
    /// </summary>
    public class DomainA
    {
        /// <summary>
        /// Gets or sets the clans.
        /// </summary>
        /// <value>The clans.</value>
        public virtual IList<DomainB> AProperty{ get; set; }
}

域对象 DomainB

/// <summary>
/// DTO for clan members
/// </summary>
public class DomainB
{
    /// <summary>
    /// Gets or sets the ID.
    /// </summary>
    /// <value>The ID.</value>
    public virtual int ID { get; set; }

    /// <summary>
    /// Gets or sets the user.
    /// </summary>
    /// <value>The user.</value>
    public virtual DomainA BProperty{ get; set; }

}

休眠查询

return session.QueryOver<DomainA>()
                .Where(a => a.ID == id)
                .Fetch(a=> a.AProperty).Eager
                .List<DomainA>().FirstOrDefault();

WCF 服务返回声明

return AutoMapper.Map<DomainA, DTOA>(returnedDomainA);

使用 fetching 和 dto 域结构和自动映射器配置运行该查询意味着我的服务超时而没有错误,我假设它试图序列化并且无休止地循环,没有 fetch 和列表为空,当然一切正常

4

1 回答 1

0

所以我决定用两种方法来解决这个问题

选项 A

更改用于映射 DomainB 的 AutoMapper 以忽略作为 DomainA 实例的 DomainB 上的属性

这意味着映射将是一个方向而不是双向

选项 B

从 DomainB 中删除 DomainA 属性!在考虑了我希望系统做什么之后,我决定删除这些链接回父母的属性

于 2011-03-07T19:29:26.053 回答