Передача данных из класса в форму через другой класс

Есть ли лучшее решение для отправки данных из одного класса в другой через другой класс? У меня есть изображение в классе 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,

Другие вопросы по тегам