Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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#_Wcf_Events - Fatal编程技术网

C# 正在冒泡要订阅的事件

C# 正在冒泡要订阅的事件,c#,wcf,events,C#,Wcf,Events,我有一个类ChatManager,里面有一个ChatServer和一个ChatClient(WCF)类 我希望实例化ChatManager的控制器能够订阅ChatClient上的UserConnected、UserDisconnected和MessageReceived事件 做这件事最优雅、最合乎逻辑的方法是什么?像我这样在ChatClient中定义事件,然后在ChatManager中重新定义事件,只将事件传递给控制器,而不必处理或了解ChatClient,这是愚蠢的吗?ChatManager将

我有一个类
ChatManager
,里面有一个
ChatServer
和一个
ChatClient
(WCF)类

我希望实例化
ChatManager
的控制器能够订阅
ChatClient
上的
UserConnected
UserDisconnected
MessageReceived
事件

做这件事最优雅、最合乎逻辑的方法是什么?像我这样在
ChatClient
中定义事件,然后在
ChatManager
中重新定义事件,只将事件传递给控制器,而不必处理或了解
ChatClient
,这是愚蠢的吗?
ChatManager
将订阅
ChatClient
的事件,然后触发
ChatController
将监听的自己的事件


我知道WPF有事件冒泡的概念,但我不知道这是否适用于这种类型的场景,因为没有任何内容是用户界面的一部分。

除非您需要事件仅有条件地到达订阅它的内容(或由多个处理程序顺序处理),“冒泡”不是你真正需要的东西。使用一个可能是最好的方法。

你要找的不是冒泡事件。通过调用父类(ChatManager)中的子类实例并订阅以下事件,您可以轻松订阅这些事件:

chatManager.UserConnected += (param1, param2) => {
    //your code here
};

我首先要问的是
ChatManager
ChatController
是否都能证明自己的存在。通常,当您发现自己创建了一个“Manager”类时,它实际上是没有必要的,尤其是当它所做的部分工作仅仅是传递消息时


控制器类可以对抗SRP,因为它们的“责任”相当广泛。如果您希望为某些行为委派责任,则将
ChatClient
的责任留给控制器,并使用
ChatClient
初始化下级控制器(通过合同界面),以便它可以根据需要与客户端交互。只要确保在开始注册事件时,在丢弃下属或客户机之前先取消注册这些事件,否则就会出现托管内存泄漏。

我使用的是Prism,它有一个事件聚合器。在模型中为事件聚合创建依赖项有意义吗?现在我的聊天经理对牛仔一无所知,我想这取决于几个因素。1) 有没有一个地方可以在不使用Prism 2的情况下使用包含ChatManager的库)有没有办法使依赖性变弱(即,只使用ChatManager中事件聚合器的接口,并让某些东西满足它的依赖性)将事件与匿名委托关联起来是一种很好的方法,可以最终得到不会被垃圾收集的实例。同意。这只是一个基本的实现。有更优雅的方式来处理这类事情。史蒂夫,我认为你可能是对的,关于两者存在的理由。最初,我在manager类本身中拥有所有服务器代码和所有客户机代码。然后,我最近将其重构为两个独立的类,而管理器仅仅是通过实例化服务器和客户机来启动服务器和连接服务器的一种方法。我认为现在最好的办法就是摆脱聊天管理器,让控制器完成所有这些。虽然我不知道这是否会使控制器过于臃肿。但是,我想这在逻辑上属于它的责任。