2012-03-23 3 views
1

У меня есть класс с 20 полями, которые заполняются из базы данных SQL при загрузке. В настоящее время я вызываю метод данных загрузки сразу после конструктора, который вызывает SQL proc и заполняет все необходимые поля. Время от времени я вообще не могу получить доступ к этим 20 полям, добавляя дополнительную стоимость вызова SQL, даже если это не требуется. Поэтому я изменил все свойства, чтобы иметь связанное личное свойство, и когда программа вызывает общедоступное свойство, сначала проверяю частное свойство, и если оно равно null, это означает, что нам нужно загрузить данные из sql, поэтому я вызываю метод загрузки. Он отлично работает, но когда я вижу код, повторяется шаблон нулевой проверки и загрузка SQL-запроса. Есть ли лучший способ сделать это?Как избежать частной собственности null проверить сделать ленивую загрузку?

private string _name; 
public string Name 
{ 
    get { 
     if (_name == null) 
     LoadData(); //this popultes not just but all the properties 
     return _name; 
    } 
} 
+2

Кажется, вы сделали один вызов базы данных по 20 вызовам, считаете ли вы, что это эффективно даже в среднем по вашему доступу, говорят только 6 - 8 значений – V4Vendetta

+1

@ V4Vendetta Нет, он просто реализует ленивый шаблон загрузки. В его комментарии говорится, что он загружает все свойства при первом вызове свойства ANY.Затем проверка будет ложной при последующих вызовах и вернет только значения памяти –

+0

Эй, вы также можете проверить один раз с помощью Constructor и привязать данные. –

ответ

4

Нет, это право. Here is the wikipedia article. Накладные расходы нулевой проверки будут очень минимальными по сравнению с ненужными вызовами базы данных. Теперь, если пользователи программы фактически используют значения в 99% случаев, я бы сказал, что этот шаблон не нужен.

Только одно примечание: если какое-либо из ваших значений может быть пустым, тогда вы будете делать ненужные вызовы базы данных. Может быть, лучше сделать что-то вроде этого (который будет еще быстрее проверить, так как это просто немного проверка):

//Constructor default to not loaded 
bool isLoaded = false; 

private string _name; 
public string Name 
{ 
    get { 
     if (!isLoaded) 
     LoadData(); //this popultes not just but all the properties 
     return _name; 
    } 
} 

private LoadData() 
{ 
    //Load Data 
    isLoaded = true; 
} 
+0

Чтобы анонимный downvoter, не могли бы вы рассказать о том, почему вы проигнорировали (если есть вероятность, что вы вернетесь и увидите это: p) –

+0

У меня была аналогичная реализация, тогда я подумал, что это может быть анти-шаблон. Я рад, что это хорошее решение. Я пойду с этим. – Nair

+0

Нет, не анти-шаблон. Однако, как я (и другие) упомянул. Убедитесь, что даже это минимальные накладные расходы того стоит. Если пользователи почти всегда нажимают на нагрузку, тогда нет реальной точки. Рад помочь :) –

0

Ну вы могли бы изменить его на:

if (!initialized) 
    LoadData(); 

И в вашем LoadData установлен в значение true, но это действительно не меняет семантики.

0

Одна вещь, которую вы можете сделать, это извлечь, если в отдельный метод, так каждое свойство содержит только один дополнительный вызов:

void EnsureData() 
{ 
     if (!dataLoaded) 
     LoadData(); //this populates all the properties 
} 

public string Name { 
    get { 
     EnsureData(); 
     return _name; 
    } 
} 
0

Я думаю, вы должны рассмотреть структуру приложения. Почему бы вам даже создать экземпляр класса, если вы не собираетесь использовать свойства? Я считаю, что на самом деле чище вызывать SQL после кода конструктора, но только создавайте объекты своего класса, если собираетесь его использовать. Другое более гибкое решение делает публикацию LoadData общедоступной и вызывает ее по мере необходимости из экземпляра объекта по мере необходимости.

+0

Не зная полной структуры программы OP, я не знаю, что вы можете сделать заявление на одеяло, чтобы не использовать ленивый шаблон загрузки. Большинство ORM (включая EF и nHibernate) используют ленивую загрузку, чтобы сократить нагрузку на базу данных. Все зависит от того, как используются объекты. –

+0

Я не верю, что я сказал ему не использовать ленивую схему загрузки. Я просто попросил его вызвать нагрузку по мере необходимости, но затем я снова использовал ленивую загрузку с шаблоном репозитория EF. – evasilchenko

+0

Извините, я неверно истолковал ваш ответ. Кроме того, FYI, я не получаю уведомление о вашем сообщении, если вы не помечаете меня. Я только что вернулся к этому –

0

Я участвую в процессе обучения шаблонов проектирования. У меня есть одно предложение, если вы загружаете данные только после того, как сможете попробовать с шаблоном проектирования singleton.

public class Singleton123 
{ 
    private static readonly string _property1 = ClassLoadData.LoadData(); 

    public static string MyProperty1 
    { 
     get 
     { 
      return _property1; 
     } 
    } 

} 

public class ClassLoadData 
{ 
    public static string LoadData() 
    { 
     // any logic to load data 
     return "test"; 
    } 
} 

вызовов свойство, как показано ниже

Singleton123 obj = new Singleton123(); 
     string stra = Singleton123.MyProperty1; 
     string strb = Singleton123.MyProperty1; 

это свойство будет загружен только один раз.

5

Btw C# имеет стандартную реализацию ленивых погрузчиков. Почему бы не использовать его, вместо того, чтобы предоставлять флаги isSomethingLoaded? :)

public class Bar 
{ 
    private Lazy<string> _name = new Lazy<string>(() => LoadString()); 

    public string Name 
    { 
     get { return _name.Value; } 
    } 
} 

В случае не статический метод LoadString, ленивый-загрузчик должен быть инициализирован конструктором;

+0

WOW не знал, что Lazy существует в C#, делает ли он нулевую проверку и загрузку? Я посмотрю на это. Если он доступен, я должен использовать вместо него другой флаг для проверки загрузки данных. – Nair

+0

Да, он существует с .Net 4. Да, он выполняет нулевую проверку и загружает значение через предоставленный делегат. Хорошие новости - вы можете использовать его не только со ссылочными типами, но и с типами значений. –

+0

привет, тогда в чем отличие дизайна шаблона bw singleton и ленивый? я думаю, оба кажутся такими же. –

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