我在这部分代码中遇到了堆栈溢出异常,显然是因为Customer对象调用了CustomerBackgroundLevel对象列表,每个对象都创建一个新的customer对象。我正试图找到解决问题的方法,任何帮助都将受到赞赏..
客户构造函数 -
public CustomerVO(Customer item)
{
CustomerID = item.CustomerID;
CustomerName = item.CustomerName;
ECNNumber = item.ECNNumber;
CustomerBackgroundLevels = item.CustomerBackgroundLevels.Select(c => new CustomerBackgroundLevelVO(c)).ToList();
}
客户背景级别构造函数 -
public CustomerBackgroundLevelVO(CustomerBackgroundLevel item)
{
CustomerBackgroundLevelID = item.CustomerBackgroundLevelID;
CustomerID = item.CustomerID;
BackgroundLevelID = item.BackgroundLevelID;
StartDate = item.StartDate;
EndDate = item.EndDate;
Customer = new CustomerVO(item.Customer);
BackgroundLevel = new BackgroundLevelVO(item.BackgroundLevel);
}
客户获取方法 -
public CustomerVO GetByID(int id)
{
var item = repository.AsQueryable().Where(x => x.CustomerID == id).FirstOrDefault();
if (item == null)
return null;
return new CustomerVO(item);
}
答案 0 :(得分:2)
是的,正如你所说的那样在一个循环中创建新对象会导致没有任何好处。
不是在构造函数中创建所有这些包装器对象,为什么不根据需要包装它们?也就是说,当您执行一些需要CustomerVO对象的代码时,在该函数中创建CustomerVO对象,然后在函数结束时让它超出范围。
答案 1 :(得分:1)
你可以像这样解决你的循环:
public CustomerVO(Customer item)
{
CustomerID = item.CustomerID;
CustomerName = item.CustomerName;
ECNNumber = item.ECNNumber;
**CustomerBackgroundLevels = item.CustomerBackgroundLevels.Select(c => new CustomerBackgroundLevelVO(c,this)).ToList();
}
**public CustomerBackgroundLevelVO(CustomerBackgroundLevel item, CustomerVO vocustomer)
{
CustomerBackgroundLevelID = item.CustomerBackgroundLevelID;
CustomerID = item.CustomerID;
BackgroundLevelID = item.BackgroundLevelID;
StartDate = item.StartDate;
EndDate = item.EndDate;
**Customer = vocustomer;
BackgroundLevel = new BackgroundLevelVO(item.BackgroundLevel);
}
答案 2 :(得分:0)
这是一个复制构造函数吗?如果是这样,您需要创建一个自定义构造函数来复制项目,而不是在新建对象并复制它的两种情况下使用它。
return new CustomerVO(item);
以上是不必要的,问题在于:
Customer = new CustomerVO(item.Customer);
将以上行更改为:
Customer = item.Customer;
除非你有参考问题,否则你需要设计一个新的构造函数。
如果item.Customer对象不是CustomerVO对象,那么您需要将当前CustomerVO对象的引用传递给CustomerBackgroundLevelVO的构造函数。