Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于管理不同类之间不同消息的中央消息管理器_C#_Wpf_Design Patterns_Software Design - Fatal编程技术网

C# 用于管理不同类之间不同消息的中央消息管理器

C# 用于管理不同类之间不同消息的中央消息管理器,c#,wpf,design-patterns,software-design,C#,Wpf,Design Patterns,Software Design,我正在用C#写一份申请书。现在我在反复考虑它的设计。我已经改变了三四次主意,但谢天谢地,这是好事 经过几次迭代后,我提出了一个解决方案,但我仍然想知道用C#实现这一点的最佳方法是什么 基本上,我将有一个类,让我们调用它MessageManager,在每个操作之后,不同的类将向MessageManager发送消息,MessageManager将根据响应发送消息。然后,我将让另一个管理器调用它UIManager,它将执行所有UI切换,或者在需要任何核心/助手操作时通知MessageManager 现

我正在用C#写一份申请书。现在我在反复考虑它的设计。我已经改变了三四次主意,但谢天谢地,这是好事

经过几次迭代后,我提出了一个解决方案,但我仍然想知道用C#实现这一点的最佳方法是什么

基本上,我将有一个类,让我们调用它
MessageManager
,在每个操作之后,不同的类将向
MessageManager
发送消息,
MessageManager
将根据响应发送消息。然后,我将让另一个管理器调用它
UIManager
,它将执行所有UI切换,或者在需要任何核心/助手操作时通知
MessageManager

现在的问题是,消息可能多达50-60种类型,每种类型都有不同类型的参数。我想设计一种方式,如果我将来有新的信息,它也能适应


在C语言中实现这一点的最佳方式是什么?比如,对于此类案例代表、事件来说,什么是最好的方式。灵活性是最重要的。

我相信,将观察者模式(发布/订阅逻辑)与中介模式结合起来,可以很好地解决您的问题。您的中介类将充当事件管理器(您的大多数类将依赖它作为中介,而不是相互依赖):

公共类消息管理器{
私人词典监听器;
公共无效发送消息(消息m){
//m的循环侦听器
}
public void addMessageListener(MessageListener ml){
//添加一个侦听器
}
public void removeMessageListener(MessageListener ml){
//删除侦听器
}
}

Message
将是父接口,在该级别具有通用抽象非常重要,因为它避免了
MessageManager
区分50-60种类型的消息,从而成为维护的噩梦。依赖于
消息的特定子类型的特殊性应该转移到一个较低的层次:直接消费者。

我相信,将观察者模式(发布/订阅逻辑)与中介者模式结合起来可以很好地解决您的问题。您的中介类将充当事件管理器(您的大多数类将依赖它作为中介,而不是相互依赖):

公共类消息管理器{
私人词典监听器;
公共无效发送消息(消息m){
//m的循环侦听器
}
public void addMessageListener(MessageListener ml){
//添加一个侦听器
}
public void removeMessageListener(MessageListener ml){
//删除侦听器
}
}

Message
将是父接口,在该级别具有通用抽象非常重要,因为它避免了
MessageManager
区分50-60种类型的消息,从而成为维护的噩梦。依赖于
消息的特定子类型的特殊性应该转移到一个较低的层次:直接消费者。

为什么不使用一些MVVM框架呢?有一个非常强大的消息传递服务,尽管从框架本身开始有点复杂。也有一个很好的messenger,几乎不需要安装。在某种程度上,我想坚持.Net提供的功能,与.Net一起工作一周左右。我更喜欢使用它已经提供的东西来了解更多的洞察力。为什么不使用一些MVVM框架呢?有一个非常强大的消息传递服务,尽管从框架本身开始有点复杂。也有一个很好的messenger,几乎不需要安装。在某种程度上,我想坚持.Net提供的功能,与.Net一起工作一周左右。我更喜欢使用它已经提供的东西来了解更多的洞察力。但是反过来呢,例如
MessageManager
Client1
发送消息,它完成了任务(通过/失败),现在
Client1
需要通知
MessageManager
它的完成情况,以便可以发送下一个操作的消息。我把它弄混了一点。请你再解释一下好吗。ThanksClient1可以发送/触发ClientMessageSuccess或ClientMessageFailure。这些信息的监听者将得到通知,采取适当的行动,并在必要时触发/发送适当的事件/信息。关于这种方法,我脑海中又浮现出一件事,即调解人部分,由于应用程序的复杂性,我应该避免使用类到类的消息传递,而我更希望使用一个中央控制器来决定下一步要做什么。有什么想法吗?嗯,没有理由说你的控制者会比调解人更复杂。决定下一步要做什么将转化为一种行为,该行为将由一些方法实现。对我来说,这种逻辑应该保留在你的客户身上。调解人就像一个红绿灯,它告诉你它是红色的,但这取决于司机,看它停止。在做了更多的研究,并考虑了许多选项后,我得出结论,你提出的设计最适合我的需要。感谢您的努力。但是反过来呢,例如
MessageManager
Client1
发送一条消息,它完成了任务(通过/失败),现在
Client1
需要通知
MessageManager
它的完成情况,以便可以发送下一个操作的消息。我把它弄混了一点。请你再解释一下好吗。ThanksClient1可以发送/触发ClientMessageSuccess或ClientMessageFailure。将通知这些消息的侦听器,采取适当的操作,并在必要时触发/发送适当的事件/消息
public class MessageManager{

    private Dictionary<string,List<MessageListener>> listeners;

    public void sendMessage(Message m){
        //loop over listeners of m
    }

    public void addMessageListener(MessageListener ml){
         //add a listener
    }

    public void removeMessageListener(MessageListener ml){
         //remove a listener
    }
}