C # Где загрузить исходные данные в объект? - PullRequest
6 голосов
/ 17 ноября 2010

Аналогично этому вопросу: Конструктор конструктора 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);
    

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

РЕДАКТИРОВАТЬ:

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

Ответы [ 3 ]

9 голосов
/ 17 ноября 2010

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

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

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

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

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

Iв этом случае вы просто определяете его как личное:

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

Затем вы просто ссылаетесь на своих клиентов в коде:

_customers.Value

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

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

5 голосов
/ 17 ноября 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...