从 Prism 中的 Shell 引发事件。有没有办法使用共享服务?还是只使用 PubSubEvent?
Raising an Event from the Shell in Prism. Is There a Way to Use a Shared Service? Or Just Use PubSubEvent?
我在 Prism 下使用 Unity 进行依赖注入,当用户运行进行测试并且没有收到任何输入时,我的模块之一会显示某种屏幕保护程序. (持有此模块视图的区域显示在所有其他区域的前面。)这个想法是如果用户在测试 运行ning 时走到房间的另一边,他们可以看到相关的摘要测试信息。当他们再次与应用程序交互时,屏幕保护程序将退出并 return 他们进入主显示屏。
由于 Shell 是捕获用户输入的内容,因此我需要提醒屏幕保护程序模块在用户与计算机交互时隐藏视图。
屏保模块本身在ViewModel中实现了一个共享服务接口,由一个Enable()方法和一个Disable()方法组成。屏幕保护程序仅在测试 运行ning 时启用。 运行 这些测试的模块将根据需要调用 Enable/Disable。 ViewModel 包含一个内部计时器,当启用屏幕保护程序时,它将在到期时触发视图的显示。如果用户交互,计时器将重置(并且视图被隐藏)。
我不想让我的应用程序在不需要时拥有大量 PubSubEvents。在这种情况下,当用户交互时,我希望能够向屏幕保护程序服务添加一种方法,Shell 可以使用该方法来指示用户交互。但是,如果没有 PubSubEvent,我看不出这是怎么可能的,因为 shell 是在屏幕保护程序模块之前创建的,除非我想使用 ServiceLocator 或通过在我的 Shell,我认为这两个选项都比使用 PubSubEvent 更糟糕。即使我将服务分离到它们自己的单独模块中,并从 Shell/Boostrapper 中引用它(通过 ConfigureContainer() 注册),该模块仍然需要以某种方式能够与 ViewModel 通信以重置 timer/hide 视图。
我是不是想多了?还有其他方法可以做到这一点吗?或者是我最初对 PubSubEvent 的想法是最好的方式。我是 Prism 的新手,所以我仍在掌握最佳实践。
我看不出使用 EventAggregator
有什么问题,但是您当然可以使用专门的服务来做基本相同的事情,只是 enabling/disabling 屏幕保护程序。只需将该服务注册为单例并在需要的地方注入它。
为了让事情变得更好一点,将主动(例如 EnableScreenSaver()
和 DisableScreenSaver()
)和被动(例如 IsScreenSaverEnabled
属性 和 ScreenSaverStateChanged
事件分开) 成员分为两个不同的接口,由同一个服务实现。通过这种方式,您可以获得一些优于 EventAggregator
的优势 - 事件不能仅发布或仅订阅,知道该事件的人总是可以发布 和 订阅。但是你可以让主动界面只被你的应用程序中想要控制屏幕保护程序的部分知道,而被动界面只能被有屏幕保护程序需要控制的部分知道...
我在 Prism 下使用 Unity 进行依赖注入,当用户运行进行测试并且没有收到任何输入时,我的模块之一会显示某种屏幕保护程序. (持有此模块视图的区域显示在所有其他区域的前面。)这个想法是如果用户在测试 运行ning 时走到房间的另一边,他们可以看到相关的摘要测试信息。当他们再次与应用程序交互时,屏幕保护程序将退出并 return 他们进入主显示屏。
由于 Shell 是捕获用户输入的内容,因此我需要提醒屏幕保护程序模块在用户与计算机交互时隐藏视图。
屏保模块本身在ViewModel中实现了一个共享服务接口,由一个Enable()方法和一个Disable()方法组成。屏幕保护程序仅在测试 运行ning 时启用。 运行 这些测试的模块将根据需要调用 Enable/Disable。 ViewModel 包含一个内部计时器,当启用屏幕保护程序时,它将在到期时触发视图的显示。如果用户交互,计时器将重置(并且视图被隐藏)。
我不想让我的应用程序在不需要时拥有大量 PubSubEvents。在这种情况下,当用户交互时,我希望能够向屏幕保护程序服务添加一种方法,Shell 可以使用该方法来指示用户交互。但是,如果没有 PubSubEvent,我看不出这是怎么可能的,因为 shell 是在屏幕保护程序模块之前创建的,除非我想使用 ServiceLocator 或通过在我的 Shell,我认为这两个选项都比使用 PubSubEvent 更糟糕。即使我将服务分离到它们自己的单独模块中,并从 Shell/Boostrapper 中引用它(通过 ConfigureContainer() 注册),该模块仍然需要以某种方式能够与 ViewModel 通信以重置 timer/hide 视图。
我是不是想多了?还有其他方法可以做到这一点吗?或者是我最初对 PubSubEvent 的想法是最好的方式。我是 Prism 的新手,所以我仍在掌握最佳实践。
我看不出使用 EventAggregator
有什么问题,但是您当然可以使用专门的服务来做基本相同的事情,只是 enabling/disabling 屏幕保护程序。只需将该服务注册为单例并在需要的地方注入它。
为了让事情变得更好一点,将主动(例如 EnableScreenSaver()
和 DisableScreenSaver()
)和被动(例如 IsScreenSaverEnabled
属性 和 ScreenSaverStateChanged
事件分开) 成员分为两个不同的接口,由同一个服务实现。通过这种方式,您可以获得一些优于 EventAggregator
的优势 - 事件不能仅发布或仅订阅,知道该事件的人总是可以发布 和 订阅。但是你可以让主动界面只被你的应用程序中想要控制屏幕保护程序的部分知道,而被动界面只能被有屏幕保护程序需要控制的部分知道...