我有一个班级ChatManager
,其中包含ChatServer
和ChatClient
(WCF)课程。
我希望实例化ChatManager
的我的控制器能够订阅UserConnected
上的UserDisconnected
,MessageReceived
和ChatClient
个事件。
最优雅和最合乎逻辑的方法是什么?我在ChatClient
中定义事件是否愚蠢,然后重新定义ChatManager
中的事件,仅将事件传递给控制器,而无需处理或了解ChatClient
? ChatManager
会订阅ChatClient
的事件,然后触发ChatController
将要收听的事件。
我知道WPF有冒泡事件的概念,但我不知道这是否属于这种情况,因为没有任何东西是用户界面的一部分。
答案 0 :(得分:2)
我首先会质疑ChatManager
和ChatController
是否能证明自己的存在。通常,每当你发现自己创建一个“经理”类时,它就没有必要,特别是如果它正在做的部分只包含中继消息。
控制器类可以与SRP斗争,因为它们的“责任”非常广泛。如果您想要委派某些行为的责任,则将ChatClient
的责任留给控制器,并使用ChatClient
(通过合同接口)初始化下级控制器,以便它可以与客户端根据需要。只需确保当您开始注册在丢弃下属或客户端之前取消注册这些事件的事件时,否则您将查看托管内存泄漏。
答案 1 :(得分:1)
这不是你正在寻找的冒泡事件。您可以通过在父级(ChatManager)中调用子类的实例并订阅事件来轻松订阅这些事件:
chatManager.UserConnected += (param1, param2) => {
//your code here
};
答案 2 :(得分:0)
除非您需要事件仅有条件地达到订阅它的事物(或由多个处理程序按顺序处理),否则“冒泡”并不是您应该需要的。使用event aggregator可能是最好的方法。