2012-01-16 14 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

는, 정적 생성자 (정적 경우)

그렇지 않으면 (비 정적 경우), 인스턴스 생성자에서 초기화 고려 클래스의 대부분의/모든 기능에 대한 중요하다, 또는 필요한 경우 클래스 내에서 호출 할 수있는

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

을 만들 것입니다. 간단한 속성 필드의 수익보다 더 많은 논리/오버 헤드를 의미

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

: 는 또한,이에 액세스해야하는 특성에, 나는 같은 대신 방법을 사용합니다.

+0

완벽한 생성자 롤, 한숨 나는 웹 개발을위한 기본적인 프로그래밍 책을 다시 읽어야한다. 나는 잊어 버리고있다. !! – Anicho

1

코드는 몇 가지 방법으로 향상시킬 수 있습니다. 하지만 귀하의 질문에 대답 - 왜 정적 c'tor를 사용하지 않습니까?

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

이것은 webDB가 정적 인 경우에만 작동합니다 (모르겠다) – Erix

+0

@Erix - 사실 그 덕분입니다. @ webc = Sitecore.Configuration.Factory.GetDatabase ("web");' @Anicho - webDB가 비 정적이어야한다고 알려주십시오. – Jonno

+0

'item = webDB.Items' 이것은 [StartItem]에서 반환됩니다.'비 정적 필드, 메소드 또는 속성에 객체 참조가 필요합니다 .'StartItem을 정적으로 만들려고 애 쓰고 있습니다. – Anicho

1

webDB 변수 정적은 단지 첫 번째 속성 호출에서 null이 될 것이라는 점을 부과 만들기 일단 당신이 그것을 확인이 방법은 실행됩니다. 인스턴스화하는 것을 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

관련 문제