2010-11-17 2 views
6

Как и к этому вопросу: C# Constructor Design, но этот вопрос немного отличается.C# Где загрузить исходные данные в объект?

У меня есть класс Customer и класс CustomerManager. Когда экземпляр создается из класса CustomerManager, я хочу загрузить всех клиентов. И здесь я застрял. Я могу сделать это несколькими способами:

  1. Загрузить все клиенты в конструкторе (мне не нравится этот, потому что это может занять некоторое время, если у меня есть много клиентов)
  2. В каждом способе CustomerManager класс, который выполняет действия, связанные с базой данных, проверьте локальный список клиентов загружается и если нет, то загрузить список:

    public method FindCustomer(int id) 
    { 
        if(_customers == null) 
        // some code which will load the customers list 
    } 
    
  3. Создайте метод, который загружает все клиенты. Этот метод должен вызываться перед вызовом метода, который выполняет базы данных, связанные с действиями:

    В классе:

    public LoadData() 
    { 
        // some code which will load the customers list 
    } 
    

    В форме:

    CustomerManager manager = new CustomerManager(); 
    manager.LoadData(); 
    Customer customer = manager.FindCustomer(int id); 
    

Что такое лучший способ сделать это?

EDIT:

У меня есть ощущение, что я неправильно понял здесь. Возможно, это потому, что я был недостаточно ясен. В классе CustomerManager у меня есть несколько методов, которые зависят от локального списка (_customers). Итак, мой вопрос: где я должен заполнить этот список?

+0

Когда вы сказали «форма», я считаю, что важно, имеете ли вы значение WebForm или WinForm; Я буду реализовывать их по-разному, потому что также задействовано кэширование. Итак, что вы имели в виду? – BeemerGuy

+0

Я использую winforms – Martijn

+0

Я думаю, вам нужно больше разработать (после вашего EDIT). Непонятно, почему ленивая загрузка не будет работать внутри вашего класса «CustomerManager», если вы меняете «_клиентов» на «ленивых» клиентов или «Lazy » и вместо этого ссылаетесь на '_customers.Value'. –

ответ

9

Что вы описываете, это «ленивая загрузка».

Простой подход, чтобы иметь частную собственность, как это:

private Lixt<Customer> _customers; 
private List<Customer> Customers 
{ 
    get 
    { 
    if(_customers == null) 
     _customers = LoadData(); 
    return _customers; 
    } 
} 

Затем вы ссылаетесь Customers внутренне. Клиенты будут загружены в первый раз, когда они понадобятся, но не раньше.

Это такой общий шаблон, который .Net 4.0 добавил класс Lazy<T>, который делает это за вас.

Я тот случай, вы просто определить его как частный, как это:

private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData); 

Тогда вы просто обратиться к своим клиентам в коде:

_customers.Value 

Класс будет инициализировать значение с ваш LoadData() способ.

Если вы еще не на .Net 4.0, класс Lazy<T> очень прост в реализации.

+1

+1 для показа меня 'Lazy '. – Heinzi

+0

Это не то, что я имел в виду, см. Мои правки. В любом случае +1 для подхода Lazy Martijn

+0

Я полагаю, я смущен. Почему вы не можете использовать этот подход в своем классе 'CustomerManager'? –

5

Используйте свойство для доступа к клиентам. Проверьте, загружены ли клиенты.

2

Ну, это зависит. Все ваши варианты имеют преимущества и недостатки.

Хорошая вещь о вариантах 1 и 3 заключается в том, что пользователь имеет полный контроль над , когда выполняется (длительная) операция по загрузке данных. Является ли вариант 1 или 3 лучше, зависит от того, имеет ли смысл создавать Менеджер и загружать данные позже или нет. Лично я предпочитаю отдельный метод LoadData, если это длительная операция, но это может быть вопросом вкуса.

Хорошая вещь о варианте 2 заключается в том, что данные не будут загружены, если они не нужны. Недостатком является то, что (длительная) загрузка возникает как побочный эффект первого доступа, что делает вашу программу «менее детерминированной».

В принципе, все варианты, которые вы представили, являются точными и действительными. Это действительно зависит от ваших требований.

Смежные вопросы