2012-01-16 2 views
0

У меня есть следующее, я хочу переместить настройку webDB и элемента за пределами следующего public string method, который является примером того, как я буду заниматься этим.Способ вызова метода один раз

public string Width 
{ 
    get 
    { 
     if (webDB != null) 
     { 
      webDB = Sitecore.Configuration.Factory.GetDatabase("web"); 
      Sitecore.Data.Items.Item item = webDB.Items[StartItem]; 

      if (item != null) 
      { 
       Sitecore.Data.Fields.Field field = item.Parent.Fields["Identity_Page_Width"]; 

       if (!String.IsNullOrEmpty(field.Value)) 
       { 
        return field.Value; 
       } 
       else 
       { 
        return "964"; // returns default pixel width if Identity_Page_Width is not defined, or is null 
       } 
      } 
      else 
      { 
       return "964"; // If item is not found return default width. 
      } 
     } 
     else 
     { 
      return "964"; 
     } 
    } 
}  

Это, как я попытался отделить его:

public void GetConfiguration() 
{ 
    if (webDB != null) 
    { 
     webDB = Sitecore.Configuration.Factory.GetDatabase("web"); 

     if (item != null) 
     { 
      item = webDB.Items[StartItem]; 
     } 
    } 
} 

но я застреваю пытаюсь запустить метод в коде я получаю method must have a return type.

Затем я хочу запустить эту GetConfiguration только в одном месте внутри класса, поэтому всем методам не нужно связываться с данными базы данных и данными больше, чем нужно.

Я мог бы сделать MyClass class = New MyClass; Class.GetConfiguration();, но я не хочу, чтобы будущие кодеры должны были знать, что это нужно создавать каждый раз, чтобы продолжить. Я бы скорее удалил эту зависимость.

ответ

1

Если webDB времени экземпляра имеет решающее значение для большинства/всех функционального класса, рассмотрит его инициализацию в конструкторе экземпляра (если не статический), или статический конструктор (если статический)

В противном случае, Я бы создал

private InitializeWebDB(){if(webDB == null){...}} 

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

public String GetWidth(){InitializeDB(); ...} 

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

+0

Совершенно в конструкторе LOL, вздох Я должен перечитать базовую книгу программирования ide для веб-разработки, заставляя меня забыть основы. !! – Anicho

1

Ваш код может быть улучшен несколькими способами. Но чтобы ответить на ваш вопрос - Почему бы не использовать статический c'tor? Таким образом, вы убедитесь, что он работает только один раз

public class SomeClass 
{ 
    static SomeClass() 
    { 
     if (webDB != null) 
     // etc. etc. 
    } 
    ... // other code 
} 
+0

Это будет работать, только если webDB является статическим (что мы не знаем) – Erix

+0

@Erix - это правда, спасибо за это. Я предположил это (неправильно) на основе строки 'webDB = Sitecore.Configuration.Factory.GetDatabase (« web »);' @Anicho - сообщите мне, если вам требуется, чтобы webDB был нестационарным. – Jonno

+0

'item = webDB.Items' это возвращается в [StartItem]' Ссылка на объект требуется для нестатического поля, метода или свойства 'Я изо всех сил стараюсь сделать статичным StartItem. – Anicho

1

Заставить webDB переменная статическая наложит, что это будет только нуль в первом вызове свойств.

private static <whatevertype> webDB; 
private static <whatevertype> item; 

public void GetConfiguration() 
{ 
    if (webDB == null) 
    { 
     webDB = Sitecore.Configuration.Factory.GetDatabase("web"); 

     if (item != null) 
      item = webDB.Items[StartItem]; 
    } 
} 
+0

Тот же вопрос, что и у Jonno StartItem, дает ссылку. – Anicho

+1

+1 за то, что помогли мне пойти в правильном направлении. – Anicho

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