1

Windows Forms 응용 프로그램에 1 개의 솔루션으로 3 개의 프로젝트가 포함되어 있습니다.호출자 클래스의 메서드 호출 및 순환 종속성 방지

Hall.Client < - 윈폼

Hall.Admin < - 윈폼

Hall.Processor < - 클래스 라이브러리 참조로

Hall.ClientHall.Admin 필요 Hall.Processor. Hall.Processor은 순환 종속성 때문에 Hall.ClientHall.Admin에 대한 참조를 추가 할 수 없습니다. 내가 필요한 건 내가이

public class Roof : System.Windows.Form 
{ 
    public void SetProcessName(string name) 
    { 
     this.txtProcessName.Text = name; 
    } 
} 

지붕라는 클래스가 Hall.Admin에서 내가 캐노피

public class Canopy : System.Windows.Form 
{ 
    public void SetProcessName(string name) 
    { 
     this.txtProcessName.Text = name; 
    } 
} 

라는 클래스가 Hall.Client에서 Hall.Processor

각 발신자 클래스의 인스턴스를 얻을 수 있습니다 Builder 클래스 내의 Hall.Processor의 메소드

public class Builder 
{ 
    Form form; 
    public Builder(Form form) 
    { 
     //Here the main problem. 
     //if the caller class is Hall.Admin.Roof then this.form should be Hall.Admin.Roof 
     //if the caller class is Hall.Client.Canopy then this.form should be Hall.Client.Canopy 
    } 
    public void SetProcessName() 
    { 
     //How to call method in caller class directly from this class 
     //if(Admin.Roof) then form.SetProcessName("something about admin"); 
     //if(Client.Canopy) then form.SetProcessName("something about client"); 
    } 
} 

내 문제를 해결하는 방법에 대한 제안이 필요합니다. 내 문제와 관련된 디자인 패턴이 있습니까?

답변

2

인터페이스를 사용하여 클래스를 서로 분리합니다. Processor 라이브러리 내에 선언 된 모든 인터페이스를 가질 수 있으며, 또는 Client, AdminProcessor 프로젝트 사이에 공유되는 별도의 라이브러리에있는 것이 더 좋습니다. 그런 다음 form is IRoof 또는 form is ICanopy과 같은 수표를 사용할 수 있습니다.

그러나이 경우 AdminIRoof에서 ICanopy 또는 Client을 구현하지 못합니다. 이것이 실제로 문제가된다면, 인터페이스 internal을 만들고 [assembly: InternalsVisibleTo("Assembly")] ("Friend Assemblies" 참조)을 통해 다른 어셈블리에 대한 가시성을 제어하십시오.

웹에서 "Dependency Injection"을 검색하십시오.

+0

나는 아직도 당신의 설명을 혼동스럽게 생각합니다. 웹에는 많은 예제가 있으며 그 중 아무 것도 내 필요와 일치하지 않습니다. – derodevil

+0

@derodevil, 정확히 무엇이 혼동됩니까? [C#의 인터페이스] (http://stackoverflow.com/a/22549046/1768303)에 익숙합니까? – Noseratio

+0

예. 내가 생각하는 것은 DI가 아닌 공장 패턴이다. 그게 내가 혼란스러워하는거야. – derodevil