2013-09-23 2 views
1

저는 여기에 자신을 그린 것으로 생각합니다. 여러 프로젝트에서 사용하는 코드가 많아서 네임 스페이스 Company에 넣을 수 있습니다.내부 이름을 알지 못하고 외부에서 내부 네임 스페이스에 액세스

모든 프로젝트 관련 코드는 Company.Project입니다. 네임 스페이스를 지정하지 않고도 프로젝트 네임 스페이스의 라이브러리 (외부 네임 스페이스)에서 코드를 호출 할 수 있습니다.이 클래스는 암시 적으로 임포트되었습니다. 벌금.

그러나 모든 프로젝트에서 사용하는 코드가 있지만 프로젝트별로 다르게 구현 된 코드가 있다고 가정 해보십시오. 예를 들어, WPF 또는 Winforms로 구현할 수있는 진단 창과 코드가 있거나 각 프로젝트마다 모양과 느낌이 다른 것으로 가정 해 보겠습니다. 프로젝트별로 프로젝트를 구현 했으므로 Company 네임 스페이스에 들어갈 수 없지만 프로젝트 네임 스페이스에있는 경우 내부 네임 스페이스를 지정하여 Company 네임 스페이스에서만 호출 할 수 있습니다. 이는 각 프로젝트마다 다를 것입니다.

나는이 문제를 해결하기 위해 대리인을 사용할 수 있다고 생각하지만, 더러워 보인다. 쉬운 방법이 있습니까?

+1

다른 프로젝트에서 재사용 할 프로젝트 별 컨트롤이 있습니까? 미안하지만 나에게 분명하지 않다. 나는 네가하고 싶은 것을 정확히 이해할 수 없었다. – BrunoLM

답변

1

IoC를 필요로하고이를 해결하기 위해 인터페이스를 사용해야하는 것처럼 들립니다. 특별한 라이브러리가없는 단순한 라이브러리는 다음과 같습니다.

// In your shared project 
namespace Company { 
    public interface IDiagnosticWindow { 
     void ShowMessage(string message); 
    } 

    public static class Utilities { 

     private static IDiagnosticWindow _diagnosticWindow; 

     public static void InitializeDiagnosticWindow(IDiagnosticWindow dw) { 
      _diagnosticWindow = dw; 
     } 

     public static void ShowMessage(string message) { 
      _diagnosticWindow.ShowMessage(message); 
     } 
    } 
} 

// In your WinForms project 
namespace Company.WinForms { 
    public class WinFormsDiagnosticWindow : IDiagnosticWindow { 
     public void ShowMessage(string message) { 
      MessageBox.Show(message); 
     } 
    } 

    static void Main() { 
     Utilities.InitializeDiagnosticWindow(new WinFormsDiagnosticWindow()); 
    } 
} 

다른 어플리케이션에도 마찬가지로 구현하십시오. 이 예에서는 앱 시작시 수동으로 초기화하는 것이 중요합니다. 그러나 Main에서이 작업을 수행하면이 작업이 초기화되고 Utilities.ShowMessage을 핵심 프로젝트 또는 응용 프로그램 프로젝트에서 사용할 수 있습니다.

Ninject와 같은 라이브러리는이 관계를 조금 더 잘 연결하여 당신을 도울 수 있습니다.

+0

나는이쪽으로 어렴풋이 보였지만 거기에 도착할 수 없었다.이 코드는 그것을 제자리에 떨어 뜨렸다. – peterG

4

인터페이스를 사용할 수 있습니까? Company 네임 스페이스에 인터페이스를 정의하십시오. 그런 다음 각 프로젝트에서 인터페이스를 구현하십시오. 그런 다음 Company 네임 스페이스의 인터페이스를 사용하십시오.

이 접근법의 단점은 인터페이스 구현의 프로젝트 별 인스턴스를 만드는 어딘가의 클래스가 여전히 필요하다는 것입니다. Company 네임 스페이스와이를 구현하는 프로젝트 별 클래스 모두에 대한 참조가 필요한 일종의 팩토리와 같습니다.

관련 문제