2014-09-06 90 views
0

我正在開發ASP.NET Web Api 2服務與.NET Framework 4.5.1和C#。僞遞歸調用= stackoverflow

我下面的這本書做到這一點:ASP.NET MVC 4 and the Web API Building a REST Service from Start to Finish

我有這兩個類。

用戶

public class User 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set; } 

    public virtual ICollection<Group> Groups { get; set; } 
} 

public class Group 
{ 
    public int GroupId { get; set; } 
    public string GroupName { get; set; } 

    public ICollection<User> Members { get; set; } 
} 

User可以有Group S和A Group具有User S作爲Members

這兩個班是我Data.Models和我使用的是Mapper類「翻譯」他們作爲Api.Models這兩種方法:

public Models.User CreateUser(Data.Models.User modelUser) 
{ 
    if (modelUser == null) 
     return null; 

    Models.User user = new Models.User() 
    { 
     UserId = modelUser.UserId, 
     UserName = modelUser.UserName 
    }; 

    if (modelUser.Groups != null) 
     user.Groups = modelUser.Groups 
      .Select(CreateGroup) 
      .ToList(); 
} 

public Models.Group CreateGroup(Data.Models.Group modelGroup) 
{ 
    if (modelGroup == null) 
     return null; 

    Models.Group group = new Models.Group 
    { 
     GroupId = modelGroup.GroupId, 
     GroupName = modelGroup.GroupName 
    }; 

    if (modelGroup.Members != null) 
     group.Members = modelGroup.Members 
      .Select(CreateUser) 
      .ToList(); 

    return group; 
} 

正如你可以Mapper類看,CreateUser方法調用CreateGroup法, CreateGroup方法調用CreateUser

對我而言user1group1的成員,group1的成員是user1。所以,我得到這個:

  • CreateUseruser1它會調用CreateGroupgroup1
  • CreateGroup對於group1它將針對user1調用CreateUser
  • 等等...

有關如何避免這種無限遞歸調用任何想法?

的溶液可能是上User,或在MembersGroupCreateUserCreateGroup方法除去像Groups導航屬性。

+0

剛剛創建空的用戶和組,然後變異既包括在他們的收藏其他對象 - 這是OO /勢在必行方式,而且是在這種情況下罰款 - 對一個不變的/功能性方法,你就需要[」打結「](http://www.haskell.org/haskellwiki/Tying_the_Knot) – Carsten 2014-09-06 10:03:44

+0

感謝您的評論,但如果我在克林貢讀過它,我會理解相同的(是個玩笑,我不會說克林貢語:-))。我正在尋找更多關於打結的信息。謝謝。 – VansFannel 2014-09-06 10:06:50

+0

不,不,這確實有點像我這邊的掠奪性評論 - 問題就在於,如果你想做這樣的事情(相互遞歸定義某些事物而不改變),它會變得非常棘手 - 只需遵循我的第一條建議和創建用戶和組,然後將它們添加到相互集合中;) – Carsten 2014-09-06 10:15:54

回答

2

至少有兩種可能的解決方案(我能想到兩種,但可能會有更多)。

  1. 簡單圖)兩者的映射器的方法分成兩個 - 第一個初始化簡單的屬性(姓名,ID),而第二個初始化導航屬性。然後,在代碼中調用映射器的地方,編寫一段更長的腳本,以便使用這些新方法來初始化從用戶到組的導航屬性,但不需要調用其他方法(從組到用戶)這樣你就可以得到一個用戶羣組圖形。

  2. 全圖)一參數添加到您的每一個方法代表已經訪問的對象的列表。然後,在遞歸調用後,檢查元素是否已經在列表中,如果不是,則檢查只有 - 將其添加並遞歸調用。這樣,遞歸調用將探索用戶和組之間的整個依賴關係圖,並將確保沒有用戶和組不會被多次處理。