我正在开发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