1

我在这部分代码中遇到了堆栈溢出异常,这显然是因为 Customer 对象调用了 CustomerBackgroundLevel 对象的列表,每个对象都创建一个新的客户对象。我正在尝试解决这个问题,任何帮助将不胜感激..

客户构造函数 -

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);
    }
4

3 回答 3

2

是的,正如您所说,在这样的循环中创建新对象不会导致任何好处。

与其在构造函​​数中创建所有这些包装器对象,不如按需包装它们?也就是说,当您执行一些需要 CustomerVO 对象的代码时,在该函数中创建 CustomerVO 对象,然后在函数结束时让它超出范围。

于 2013-03-26T13:11:05.417 回答
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);
}
于 2013-03-26T13:08:14.317 回答
0

那是复制构造函数吗?如果是这样,您需要创建一个自定义构造函数来复制项目,而不是在新建对象并复制它的两种情况下都使用它。

return new CustomerVO(item);

以上是不必要的,问题线是:

Customer = new CustomerVO(item.Customer);

将上面的行更改为:

Customer = item.Customer;

除非你有参考问题,这意味着你需要设计一个新的构造函数。

如果 item.Customer 对象不是 CustomerVO 对象,那么您需要将当前 CustomerVO 对象的引用传递给 CustomerBackgroundLevelVO 的构造函数。

于 2013-03-26T13:11:48.717 回答