我正在開發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
。
對我而言user1
是group1
的成員,group1
的成員是user1
。所以,我得到這個:
- 在
CreateUser
爲user1
它會調用CreateGroup
爲group1
。 - 對
CreateGroup
對於group1
它將針對user1
調用CreateUser
。 - 等等...
有關如何避免這種無限遞歸調用任何想法?
的溶液可能是上User
,或在Members
類Group
從CreateUser
和CreateGroup
方法除去像Groups
導航屬性。
剛剛創建空的用戶和組,然後變異既包括在他們的收藏其他對象 - 這是OO /勢在必行方式,而且是在這種情況下罰款 - 對一個不變的/功能性方法,你就需要[」打結「](http://www.haskell.org/haskellwiki/Tying_the_Knot) – Carsten 2014-09-06 10:03:44
感謝您的評論,但如果我在克林貢讀過它,我會理解相同的(是個玩笑,我不會說克林貢語:-))。我正在尋找更多關於打結的信息。謝謝。 – VansFannel 2014-09-06 10:06:50
不,不,這確實有點像我這邊的掠奪性評論 - 問題就在於,如果你想做這樣的事情(相互遞歸定義某些事物而不改變),它會變得非常棘手 - 只需遵循我的第一條建議和創建用戶和組,然後將它們添加到相互集合中;) – Carsten 2014-09-06 10:15:54