2013-12-08 2 views
0

다른 클래스를 통해 한 클래스에서 다른 클래스로 데이터를 보내는 더 좋은 솔루션이 있습니까? ImageProcessing 클래스의 이미지가 있고 클래스를 MainForm 클래스로 보내려고합니다.다른 클래스를 통해 클래스에서 Form으로 데이터 전달

  • MainForm.cs (GUI)
  • VideoProccessing.cs
  • ImageProccessing.cs

나는이 의사가 :

class MainForm : Form 
    { 
     VideoProccessing _video = new VideoProccessing(); 
    } 

    class VideoProccessing 
    { 
     ImageProccessing _image = new ImageProccessing(); 
    } 

    class ImageProccessing 
    { 
     Bitmap _bmp = null; 

     public void SomeBadassProcess() 
     { 
      _bmp = new Bitmap();   //How to send this to MainForm (GUI) 
     } 
    } 

내 솔루션 :

class MainForm : Form 
    { 
     VideoProccessing _video = new VideoProccessing(); 
     _video.SendAgain += (ShowImage); 

     private void ShowImage(Bitmap bmp) 
     { 
      SomePictureBox.Image = bmp; 
     } 

    } 

    class VideoProccessing 
    { 
     ImageProccessing _image = new ImageProccessing(); 
     _image.Send += (ReceivedImage) 

     public delegate void SendAgainImage(Bitmap bmp); 
     public event SendAgainImage SendAgain; 

     private void ReceivedImage(Bitmap bmp) 
     { 
      SendAgain(bmp); 
     } 
    } 

    class ImageProccessing 
    { 
     Bitmap _bmp = null; 

     public delegate void SendImage(Bitmap bmp); 
     public event SendImage Send; 

     public void SomeBadassProcess() 
     { 
      _bmp = new Bitmap();   //How to send this to MainForm (GUI) 

      Send(_bmp); 
     } 
    } 

답변

1

VideoProcessing 클래스가 ImageProcessing 클래스에 대한 종속성이있는 경우 MainFormVideoProcessing을 알리고 자한다면 자신이 사용하는 방식대로 메시지를 전파하는 것이 좋습니다. 그러나 개체 사이에 강력한 결합이 이루어지기 때문에이 단계에서 관심을 가질 수도 있고 그렇지 않을 수도 있습니다.

또 다른 방법은 EventAggregator 또는 Mediator과 같은 일종의 메시지 버스를 사용할 수 있습니다. 이 두 가지 동작 패턴은 메시징 프로세스에 관련된 객체를 분리하고 publish/subscribe 메커니즘을 제공하도록 설계되었습니다. 당신이 구현한다면 예를 들어

EventAggregator 당신의 MainForm이 시나리오에서 ImageProcessing 클래스를하는 publisher에서 전송 알림을 알아 듣고하는 subscriber 될 것이다.

인위적인 코드 예제는 다음과 같습니다

public class MainForm : Form 
{ 
    private readonly EventAggregator eventAggregator; 
    private readonly VideoProcessing videoProcessing; 

    public MainForm() 
    { 
     this.eventAggregator = new EventAggregator(); 
     this.eventAggregator.Subscribe<NewBitmapEvent>(HandleNewBitMap); 
     this.videoProcessing = new VideoProcessing(this.eventAggregator); 
    } 

    private void HandleNewBitmap(Bitmap args) 
    { 
     // Do something 
    } 
} 

public class VideoProcessing 
{ 
    private readonly EventAggregator eventAggregator; 

    private readonly ImageProcessing imageProcessing; 

    public VideoProcessing(EventAggregator eventAggregator) 
    { 
     this.eventAggregator = eventAggregator; 
     this.imageProcessing = new ImageProcessing(this.eventAggregator); 
    } 
} 


public class ImageProcessing 
{ 
    private readonly EventAggregator eventAggregator; 

    public ImageProcessing(EventAggregator eventAggregator) 
    { 
     this.eventAggregator = eventAggregator; 
     this.eventAggregator.Publish<NewBitmapEvent>(new Bitmap(...)); 
    } 
} 

ImageProcessing 클래스 publishesNewBitmapEventMainForm은 그것으로 통보 아니라 VideoProcessing 클래스는 이벤트에 subscribed입니다됩니다. 다른 클래스가 구독 되었다면 분명히 이벤트가 published 일 때 알림을 받게됩니다.

관련 문제