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 に答える