Передача данных из класса в форму через другой класс
Есть ли лучшее решение для отправки данных из одного класса в другой через другой класс? У меня есть изображение в классе ImageProccessing, и я хотел бы отправить его в класс MainForm.
- 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
класс, однако, вы только хотите сделать свой MainForm
знать о VideoProcessing
затем распространение вашего сообщения таким образом, как вы, вероятно, является приемлемым. Это, однако, создает прочную связь между вашими объектами, которая может вас заинтересовать или не заботиться на данном этапе.
Другим методом может быть использование некоторой шины сообщений, такой как EventAggregator
или Mediator
, Оба эти поведенческих паттерна предназначены для отделения объектов, участвующих в процессе обмена сообщениями, и обеспечения publish/subscribe
механизм.
В качестве примера, если вы должны были реализовать EventAggregator
ваш MainForm
будет subscriber
, прослушивая уведомления, отправленные с publisher
который в вашем сценарии является ImageProcessing
учебный класс.
Придуманный пример кода может выглядеть следующим образом:
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
учебный класс publishes
NewBitmapEvent
, только MainForm
уведомляется как только он, а не как VideoProcessing
класс subscribed
на событие. Очевидно, что если бы другие классы были подписаны, то они тоже были бы уведомлены, когда событие published
,