Общий подход для публикации сообщений о состоянии бизнес-логики в пользовательском интерфейсе? - PullRequest
0 голосов
/ 12 марта 2010

Я некоторое время боролся с этим вопросом, и я не пришел к выводу. Я, как правило, не программист пользовательского интерфейса, так что простите за глупость.

Я пишу типичное приложение со слоем пользовательского интерфейса (WPF) и бизнес-уровнем. Я хочу публиковать сообщения о состоянии в пользовательском интерфейсе от бизнес-уровня (возможно, глубоко внутри бизнес-уровня), но я не хочу, чтобы бизнес-уровень обладал любым знанием пользовательского интерфейса. Существует ли общепринятая схема для этого?

Я думал о том, чтобы иметь какую-то очередь сообщений, в которую бизнес-уровень отправляет сообщения о состоянии, и чтобы модель представления пользовательского интерфейса подписывалась на эту очередь и перехватывала сообщения из очереди и направляла их в пользовательский интерфейс. Это хороший подход? Где-то еще я должен начать?

Спасибо.

1 Ответ

1 голос
/ 13 марта 2010

Я думаю, что это хороший подход в целом. Я бы создал интерфейс для вашего провайдера сообщений, который публикует событие при получении сообщения (где Сообщение - это тип сообщения, который вы хотите):

public class MessageReceivedEventArgs : EventArgs
{
    public MessageReceivedEventArgs(Message message)
        : base()
    {
        Message = message;
    }

    public Message Message { get; set; }
}

public delegate void MessageRecievedHandler(object sender, MessageReceivedEventArgs e);

public interface IMessageProvider
{
    event MessageRecievedHandler MessageReceived;
    void Start();
    void Stop();
    bool IsRunning { get; }
}

public abstract class MessageProviderBase : IMessageProvider
{
    public event MessageRecievedHandler MessageReceived;

    public MessageProviderBase()
    {}

    protected void OnMessageReceived(MessageReceivedEventArgs e)
    {
        if (MessageReceived != null)
        {
            MessageReceived(this, e);
        }
    }

    public abstract void Start();
    public abstract void Stop();

    public abstract bool IsRunning { get; }
}
...