与ManyToMany关系和automapper的循环引用

时间:2014-04-23 20:29:23

标签: asp.net-mvc fluent-nhibernate domain-driven-design automapper

鉴于以下域实体:

public class Person {
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    public virtual ISet<PersonClub> Clubs { get; set; }

    public Person() {
        this.Clubs = new HashSet<PersonClub>();
    }
}

public class Club {
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    public virtual ISet<PersonClub> Members { get; set; }

    public Club() {
        this.Persons = new HashSet<PersonClub>();
    }
}

public class PersonClub {
    public virtual Guid Id { get; set; }
    public virtual Person Person { get; set; }
    public virtual Club Club { get; set; }
}

和DTO:

public class PersonDTO {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ISet<ClubDTO> Clubs { get; set; }

    public PersonDTO() {
        this.Clubs = new HashSet<ClubDTO>();
    }
}

public class ClubDTO {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ISet<PersonDTO> Members { get; set; }

    public ClubDTO() {
        this.Members = new HashSet<PersonDTO>();
    }
}

有没有办法将这些域实体映射到他们的DTO?问题是PersonDTO需要一个ClubDTO的集合,而不仅仅是Club,而ClubDTO需要一个PersonDTO而不仅仅是Person的集合。

此设计在尝试映射PersonClub时会导致无限循环 - &gt; PersonDTO和PersonClub - &gt; ClubDTO:

Mapper.CreateMap<Person, PersonDTO>();
Mapper.CreateMap<Club, ClubDTO>();
Mapper.CreateMap<PersonClub, ClubDTO>()
    .ConvertUsing(x => Mapper.Map<Club, ClubDTO>(x.Club));
Mapper.CreateMap<PersonClub, PersonDTO>()
    .ConvertUsing(x => Mapper.Map<Person, PersonDTO>(x.Person));

我理解为什么会这样,但我很好奇其他人如何处理这种情况。

在这种情况下,当调用Mapper.Map<Person, PersonDTO>(personEntity)时,没有必要加载一个人所属的所有俱乐部的所有成员(这种关系不需要那么深入)。 Mapper.Map<Club, ClubDTO>(clubEntity)也是如此。

这是一个设计缺陷吗?不拥有PersonClub域实体并且只有public virtual ISet<Club> Clubs { get; set; }作为ManyToMany关系会更好吗?虽然我相信这仍然会导致循环引用。

赞赏任何意见。

0 个答案:

没有答案