【问题标题】:General approach for posting business logic status messages to UI?将业务逻辑状态消息发布到 UI 的一般方法?
【发布时间】:2010-03-12 20:48:37
【问题描述】:

我一直在为这个问题苦苦挣扎,但我还没有得出结论。我通常不是 UI 程序员,所以请原谅我的笨拙。

我正在编写一个带有 UI 层 (WPF) 和业务层的典型应用程序。我想从业务层(可能在业务层深处)向 UI 发布状态消息,但我不希望业务层对 UI 有任何知识。对此有普遍接受的模式吗?

我想有一个消息队列,业务层向其发布状态消息,并让 UI 的视图模型订阅该队列并截取队列中的消息并将它们路由到 UI。这是一个好方法吗?还有其他地方我应该开始吗?

谢谢。

【问题讨论】:

    标签: user-interface model view message status


    【解决方案1】:

    我认为总的来说这是一个很好的方法。我会为您的消息提供者创建一个接口,在收到消息时发布事件(其中 Message 是您想要的消息类型):

    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; }
    }
    

    【讨论】:

    • 从 MessageProviderBase 派生的类似乎应该是单例?
    • 有可能,但不是必须的。 MessageProviderBase 的存在只是为了向潜在的 IMessageProvider 提供 OnMessageReceived 方法,尽管您并不严格需要从它派生来实现 IMessageProvider。 PS:如果您从 MessageProviderBase 派生,最好也将您的类列为实现 IMessageProvider,以免混淆 WPF 的 xaml 解析器(如果您要走那条路线): public class CustomMessageProvider : MessageProviderBase, IMessageProvider
    • 别忘了把它标记为答案,这样它就不会出现在未回答的列表中。
    • 感谢杰里米的提醒。我不知道那个功能。我也是一个堆栈溢出菜鸟。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多