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 : IScreen
、Screen2VM : IScreen
和Screen3VM : IScreen
。我将所有这 3 个 类 注册为 IScreen
的实现,然后在管理这些屏幕的 TabControlVM
的构造函数中,我提供了一个类型为 IEnumerable<IScreen>
的参数 screens
.执行程序后,Castle Windsor 将实现 IScreen
接口的 类 实例注入到此参数中(也就是说,类型 Screen1VM
、Screen2VM
和 Screen3VM
的实例).如果我想要另一个屏幕配置,我只需注册另一个 类 作为 IScreen
.
的实现
所以我想问问Catel是否提供这样或类似的功能,因为我在Catel文档中没有找到。
还有一个额外的问题:Catel 是否提供了一些服务,允许 ViewModels 在没有相互引用的情况下相互通信(换句话说,像 Caliburn 中的 EventAggregator
允许 类订阅事件并发布它们)?
Catel 提供开箱即用的所有这些。
有关选项卡式界面的示例,请查看 TabControl from Orc.Controls and the Catel docs
您可以使用标签为不同的实现注册相同的接口。这意味着您可以使用特定标记等向 Screen1VM 注册 IScreen。但是,我们建议您让 Catel 使用命名约定为您解决此问题(再次请参阅步骤 1 中的示例)。
Catel 支持类似的 IMessageMediator。但是,我们认为您应该将应用程序状态存储在服务中,因为您不应该假设视图模型的生命周期。因此,我们建议更新服务中的状态,并让每个视图模型根据来自此共享(长期)服务的事件进行更新。 Catel 的好处是您可以使用 InitializeAsync
订阅事件并使用 CloseAsync
取消订阅,这样您就不会泄露您的视图模型。
奖金
一些使用 Catel 编写的示例应用程序:
检查基于 Catel 的所有其他组件:http://opensource.wildgums.com/
我已经研究 Catel 框架几天了,考虑从 Caliburn Micro + Castle Windsor 转移到它。
我的应用程序有一组不同的屏幕,应该可以通过 TabControl
中的选项卡访问这些屏幕。此外,应用程序具有定义一组这些屏幕的不同配置 - 因此屏幕组各不相同。
每个屏幕都是遵循MVVM模式的一对View和对应的ViewModel。在之前的项目中,我使用 Castle Windsor 作为 IoC 容器,它允许将多个 类 注册为接口实现,并提供一种方法将所有创建的对象解析为该接口类型的集合。
例如,我有Screen1VM : IScreen
、Screen2VM : IScreen
和Screen3VM : IScreen
。我将所有这 3 个 类 注册为 IScreen
的实现,然后在管理这些屏幕的 TabControlVM
的构造函数中,我提供了一个类型为 IEnumerable<IScreen>
的参数 screens
.执行程序后,Castle Windsor 将实现 IScreen
接口的 类 实例注入到此参数中(也就是说,类型 Screen1VM
、Screen2VM
和 Screen3VM
的实例).如果我想要另一个屏幕配置,我只需注册另一个 类 作为 IScreen
.
所以我想问问Catel是否提供这样或类似的功能,因为我在Catel文档中没有找到。
还有一个额外的问题:Catel 是否提供了一些服务,允许 ViewModels 在没有相互引用的情况下相互通信(换句话说,像 Caliburn 中的 EventAggregator
允许 类订阅事件并发布它们)?
Catel 提供开箱即用的所有这些。
有关选项卡式界面的示例,请查看 TabControl from Orc.Controls and the Catel docs
您可以使用标签为不同的实现注册相同的接口。这意味着您可以使用特定标记等向 Screen1VM 注册 IScreen。但是,我们建议您让 Catel 使用命名约定为您解决此问题(再次请参阅步骤 1 中的示例)。
Catel 支持类似的 IMessageMediator。但是,我们认为您应该将应用程序状态存储在服务中,因为您不应该假设视图模型的生命周期。因此,我们建议更新服务中的状态,并让每个视图模型根据来自此共享(长期)服务的事件进行更新。 Catel 的好处是您可以使用
InitializeAsync
订阅事件并使用CloseAsync
取消订阅,这样您就不会泄露您的视图模型。
奖金
一些使用 Catel 编写的示例应用程序:
检查基于 Catel 的所有其他组件:http://opensource.wildgums.com/