2010-07-29 5 views
2

다음과 같은 점에 유의하십시오. 서로간에 독립적으로 존재해야하는 두 개의 프로젝트가 있습니다. 프로젝트 하나는 파일 시스템 감시자입니다. 다른 하나는 내 UI의 코지 니스트입니다. 파일 감시자는 새 파일이있는 경우 이벤트를 발생시킵니다. 그런 다음 파일의 데이터를 데이터베이스에 추가해야합니다. 그것은 배경 이야기가 굵은 것입니다. 실제 문제는 파일 감시자가 이벤트를 발생시킨 후 데이터 뷰를 업데이트하도록 UI에 알리고 싶습니다. 즉, 파일 감시자가 이벤트를 발생시켜 UI 구현에 이벤트를 등록해야합니다. 이제는 두 프로젝트의 수업이 필요합니다. Obviuosly 이것은 순환 종속성 문제를 초래합니다. 물론 CP 문제에 대한 인터페이스 솔루션이 있지만 문제를 해결할 수는 없으며 데이터 생성 및 이벤트 등록에 동일한 개체가 필요합니다. 이 문제로 도움을 받으실 수 있기를 바랍니다. 감사합니다. .멀티 프로젝트에서 커스텀 이벤트를 발생 시키십시오.

+0

파일 감시자가 UI의 클래스를 필요로하는 이유는 무엇입니까? – Oded

답변

1

왜 비즈니스 로직 어셈블리에 UI 인스턴스가 필요하다고 생각하십니까?

이벤트 핸들러를 등록하려면 호출 어셈블리 (observer, 이미 호출 어셈블리에 포함되어 있음)의 인스턴스와 참조 된 어셈블리 (파일 시스템 감시자를 포함하는 어셈블리)의 인스턴스 만 필요합니다.

그런 다음 예 : 다음과 같은 구조 : UI와 로직

public class MyCustomWatcher 
{ 
    public event EventHandler Event; 

    private void RaiseEventForWhateverReason() 
    { 
     if (Event != null) 
     { 
      Event(this, new Args()); 
     } 
    } 
    public Data GetData() 
    { 
    //return the data 
    } 
} 

총회와

어셈블리 : - 모두 형태와 컨트롤러 유형은 여기에 선언됩니다.

class Form : System.Windows.Forms.Form 
{ 
public void DisplayNotification(Data data) 
{ 
    //actual code here 
} 
} 

class Controller 
{ 
    private Form form; 
    private MyCustomWatcher watcher; 

    public void Init() 
    { 
     this.watcher = CreateWatcher(); 
     RegisterEvents(); 
     ShowForm(); 
    } 
    void ShowForm() 
    { 
    //show 
    } 
    void RegisterEvents() 
    { 
     this.watcher.Event += HandleChange; 
    } 

    void HandleChange(object sender /*this will be the instance that raised the event*/, SomeEventArgs e) 
    { 
     //BTW: this.watcher == sender; //the same instance 

     form.DisplayNotification(this.watcher.GetData()); 
    } 
} 

로직이있는 어셈블리를 참조하는 어셈블리. 여기에는 순환 종속성이 없습니다.

+0

예를 들어 주셔서 감사합니다. 나는 이미 당신의 해결책을 깨달았지만, 문제는 이전처럼이 줄에있다. this.watcher = CreateWatcher(); WatchEvent를 등록한 후와 watcher.RaiseEventForWhateverReason()을 호출 할 때와 동일한 Watchcher 인스턴스를 어떻게 만들 수 있습니까? 그것이 나의 주요 문제이다. 또한 인스턴스는 짧은 시간에 많은 이벤트를 수신 할 수 있기 때문에 어떤 방식 으로든 차별화되어야합니다. –

+0

watcher는 들판입니다. 그것을 지정하면 동일한 인스턴스를 가리키는 채로 유지됩니다.샘플에 표시된 것처럼 보낸 사람 매개 변수는 이벤트를 발생시킨 인스턴스가 될 것입니다.이 매개 변수를 캐스팅하고 로컬 변수 Watcher theSender = (Watcher) 보낸 사람에게 할당하면됩니다. 이것은 여러 인스턴스가있는 경우에 도움이됩니다. – Marek

0

FileWatcher가 UI에 종속성이있는 이유를 잘 모르겠지만 두 번째 프로젝트 사이에 event aggregator으로 작동하도록 추가 할 수 있습니다. 이렇게하면 두 프로젝트 모두 애그리 게이터에 종속되지만 서로에 대한 종속성은 제거됩니다.

+0

죄송합니다. 잘못 했으므로 충분히 설명하지 않았습니다. UI는 몇 가지 종속성을 필요로하지 않습니다. 아마도 몇 줄의 코드에서 내 문제를 명확히 할 수 있습니다. FileWatcher : Recording rec = new Recording(); rec.NotifyUI(); UI : 녹음 pat = 새 녹음; pat.RecordingStarted + = listview.UpdateList; Recording은 FW 프로젝트의 클래스이며 RecordingStarted는 이벤트이고 UpdateList는 이벤트가 발생할 때마다 실행되어야하는 메서드입니다. 그런 다음 UpdateList는 GetNewData()와 같은 Recording 클래스에서 새 데이터를 가져와야합니다. –