2013-07-12 3 views
2

아래 Class2GetSomething이 호출되기 전에 설정해야하는 속성이 있습니다. 그러나 의 상단에있는 Class2에 액세스하기 때문에이 속성은 Something 클래스에 도달하면 항상 null입니다. 속성을 사용하기 전에 설정하기 위해 코드를 변경하는 방법을 알아낼 수 없습니다. 누군가?정적 클래스를 초기화하기 전에 정적 속성을 초기화하는 방법은 무엇입니까?

편집 form1의 생성자에서 의존성을 전달하고 싶습니다.

public partial class form1 
{ 
    private static readonly ISomeConstructedClass someConstructedClass = Class1.SomeConstructedClass; 
    public form1() 
    { 
     someConstructedClass.SomeDependency = new SomeDependency(); 
     someConstructedClass.Whatever(); 
    } 
} 
public static class Class1 
{ 
    public static readonly ISomething something = (ISomething)Class2.GetSomething("something"); 
    public static ISomeConstructedClass SomeConstructedClass 
    { 
    get 
    { 
     return something.SomeConstructedClass; 
    } 
    } 

} .... }

public class Class2 
{ 
    public static ISomeDependency SomeDependency 
    { 
     get; 
     set; 
    } 
    public static GetSomething(string something) 
    { 
     switch(something) 
     { 
      case "something": 
       return new Something(SomeDependency); 
     }   
    } 
} 

    public class Something : ISomething 
    { 
     public ISomeDependency SomeDependency 
     { 
      get; 
      set; 
     } 
     public Something(ISomeDependency someDependency) 
     { 
      SomeDependency = someDependency; 
     } 
    } 
+1

속성을 어디에서 초기화합니까? – SLaks

+0

@SLaks - 질문에 대한 답변을 더 많이 추가했습니다. –

+0

어쨌든'form1'의 컨스트럭터로 설정하려는 경우 Class2의 SomeDependency로'someConstructedClass'를 초기화하는 이유는 무엇입니까? '새로운 SomeDependency()'로 설정하기 전에 무엇을 설정하고 싶습니까? – Cemafor

답변

2

[다시] 편집 :

나는 당신이 전에 뭘하려고했는지에 대해 혼란스러워했다

, 당신은 단지 종속성을 작성해야 먼저.

public partial class form1 
{ 
    private static /*readonly*/ ISomeConstructedClass someConstructedClass; 
    public form1() 
    { 
     Class2.SomeDependency = new SomeDependency(); 
     someConstructedClass = Class1.SomeConstructedClass; 
     someConstructedClass.Whatever(); 
    } 
} 

나는 또한 단지 (Form1에 생성자를 호출하기 전에) 너무 빨리 초기화되지 않았는지 확인하기 위해 재산에 뭔가의 창조를 이동합니다.

public static class Class1 
{ 
    public static ISomething something; 
    public static ISomeConstructedClass SomeConstructedClass 
    { 
     get 
     { 
      if (something == null) { 
       something = (ISomething)Class2.GetSomething("something"); 
      } 
      return something.SomeConstructedClass; 
     } 
    } 
} 

당신은 static constructor를 사용할 수 있습니다. 이것은 정적 (또는 그 문제에 대한 인스턴스) 필드 나 메소드가 호출되거나 액세스되기 전에 호출됩니다. 같은

뭔가 :

static Class2() { 
    SomeDependency = SomeDependencyYouNeed; 
} 
+0

정적 생성자가 매개 변수가 없으므로 ISomeDependency가 생성자에서 하드 코딩 된 경우에는 문제가없는 것처럼 보입니다. – Taylor

+0

@Taylor : 그래, 나는 그가 어디에서 의존성을 얻고 싶은지 모르겠다. 그래서 도움이 될만한 것을 제공 할 것이라고 생각했다. – Cemafor

+0

@Cemafor - 비 정적 생성자에서 정적 읽기 전용 필드를 할당 할 수 없으므로 위의 내용이 작동하지 않습니다. ( –

0

왜 정적 메서드를 사용하고 있습니까? 당신이 일종의 Dependency Injection을 시도하는 것 같습니다. Class2의 인스턴스를 만들고 생성자에 종속성을 전달하고 정적 메서드는 사용하지 말고 종속성을 GetSomething() 메서드의 매개 변수로 전달하십시오.

public static GetSomething(string something, ISomeDependency dependency). 
+0

모두가이 종속성을 필요로하지만, 그래서 그것을 GetSomething에 전달하는 것은 의미가 없습니다. –

관련 문제