Catel 是否提供将同一服务耦合到一个集合中的实现?

Does Catel provide coupling implementation of the same service into one collection?

我已经研究 Catel 框架几天了,考虑从 Caliburn Micro + Castle Windsor 转移到它。

我的应用程序有一组不同的屏幕,应该可以通过 TabControl 中的选项卡访问这些屏幕。此外,应用程序具有定义一组这些屏幕的不同配置 - 因此屏幕组各不相同。

每个屏幕都是遵循MVVM模式的一对View和对应的ViewModel。在之前的项目中,我使用 Castle Windsor 作为 IoC 容器,它允许将多个 类 注册为接口实现,并提供一种方法将所有创建的对象解析为该接口类型的集合。

例如,我有Screen1VM : IScreenScreen2VM : IScreenScreen3VM : IScreen。我将所有这 3 个 类 注册为 IScreen 的实现,然后在管理这些屏幕的 TabControlVM 的构造函数中,我提供了一个类型为 IEnumerable<IScreen> 的参数 screens .执行程序后,Castle Windsor 将实现 IScreen 接口的 类 实例注入到此参数中(也就是说,类型 Screen1VMScreen2VMScreen3VM 的实例).如果我想要另一个屏幕配置,我只需注册另一个 类 作为 IScreen.

的实现

所以我想问问Catel是否提供这样或类似的功能,因为我在Catel文档中没有找到。

还有一个额外的问题:Catel 是否提供了一些服务,允许 ViewModels 在没有相互引用的情况下相互通信(换句话说,像 Caliburn 中的 EventAggregator 允许 类订阅事件并发布它们)?

Catel 提供开箱即用的所有这些。

  1. 有关选项卡式界面的示例,请查看 TabControl from Orc.Controls and the Catel docs

  2. 您可以使用标签为不同的实现注册相同的接口。这意味着您可以使用特定标记等向 Screen1VM 注册 IScreen。但是,我们建议您让 Catel 使用命名约定为您解决此问题(再次请参阅步骤 1 中的示例)。

  3. Catel 支持类似的 IMessageMediator。但是,我们认为您应该将应用程序状态存储在服务中,因为您不应该假设视图模型的生命周期。因此,我们建议更新服务中的状态,并让每个视图模型根据来自此共享(长期)服务的事件进行更新。 Catel 的好处是您可以使用 InitializeAsync 订阅事件并使用 CloseAsync 取消订阅,这样您就不会泄露您的视图模型。

奖金

  1. 一些使用 Catel 编写的示例应用程序:

  2. 检查基于 Catel 的所有其他组件:http://opensource.wildgums.com/