C # - Задача класса дизайн - Загрузка списка свойств - PullRequest
0 голосов
/ 17 ноября 2009

Предположим, у меня есть класс, подобный следующему:

public class Stage
{
    public int ID {get; set;}
    public strint Code {get; set;}
    public string Name {get; set;}

    private List<Machine> _machines;
    public List<Machine> Machines
    {
        get{ return _machines; }
        set{ _machines = value; }
    }

    .........
    .........

    // This method returns all the Stages stored
    // in the Stage-table in the database.
    public static List<Stage> Get()
    {       
    }
}

Теперь вопрос в том, когда мне загрузить список _machines?

Я ожидал 2 способа:

(1) В методе Stage.Get():

Как это:

public static List<Stage> Get()
{
    List<Stage> stages = null;

    try
    {
        //Begin transaction...


        //Retrieve all Stages and put them in List<Stage> stages
        .................
        .................

        //End transaction...

        if(stages!=null)
        {
            //Now load Machines for each Stage
            for(int i=0 ; i<stages.Count ; i++)
            {
                //Get Machines by Stage ID and put them on List<Machine>
                stages[i].Machines = Machine.Get(stages[i].ID);
            }
        }       
    }
    catch(Exception ex)
    {
        stages = null;

        throw ex;
    }

    return stages;
}

Единственная проблема с этим заключается в том, что если у Machine есть свойство List<T> - (например, List<Part> Parts и т. Д.), А метод Machine.Get(stages[i].ID) - имеет похожее кодирование, это приведет к рекурсивной загрузке всей таблицы. Таким образом, вся база данных может быть загружена в память.

(2) Прямой доступ к базе данных в собственности:

private List<Machine> _machines;
public List<Machine> Machines
{
    get
    { 
        //Get Machines by Stage ID and put them on List<Machine>
        _machines = Machine.Get(this.ID);

        return _machines; 
    }
    set{ _machines = value; }
}

Проблема с этим:

(i) Это приведет к огромной потере производительности:

Stage stage = Stage.Get(...ID...);

foreach(Machine m in stage.Machine)
{
    //Do something
    ..............
}

Coz, каждый раз, когда такой цикл запускается, база данных должна быть доступна.

(ii) get и set должны обрабатываться по-разному в Save(), Update() и т. Д.

Может кто-нибудь предложить мне лучший способ?

1 Ответ

2 голосов
/ 17 ноября 2009

Учитывая ваш дизайн, вам не нужно загружать данные каждый раз при обращении к свойству. Вместо этого вы можете проверить, установлен ли он еще, и выполнять загрузку только при необходимости. Это ленивая загрузка дизайн.

private List<Machine> _machines;
public List<Machine> Machines
{
    get
    { 
        //Get Machines by Stage ID and put them on List<Machine>
        //only if we have not already done so
        if (_machines == null)
        {
            _machines = Machine.Get(this.ID);
        }

        return _machines; 
    }
    set{ _machines = value; }
}
...