C# Prism:在视图实例化之前实例化模型
C# Prism: Instantiate Model before View Instantiation
TL;DR 有没有办法强制 MEF Prism 容器在 View Disovery 实例化之前实例化 class?即在 regionManager.RegisterViewWithRegion
之前
我有一个用户登录的业务流程,然后我开始一些数据库读取。 LoginEvent
注册到 EventAggregator
以便应用程序的其他部分可以听到它。问题是我的模型 MyModel
仅在依赖视图注册后才实例化,这当然发生在 之后 登录事件已经过去。我可以这样做 MyModel
的构造函数,但感觉很草率。
当前进程
1. User logs in
2. LoginEvent is dispatched
2. View switches to MyView
3. MyModel is instantiated and listens for LoginEvent that will never be dispatched
期望的过程
1. MyModel is instantiated and listens for LoginEvent
2. User Logs in
3. LoginEvent is dispatched
4. MyModel hears LoginEvent and kicks of data read.
非常感谢对此的任何帮助。
提前实例化您的视图,以便它可以侦听事件。您可以按照 prism 文档中的描述使用 Module concepts 在模块 Initialize 事件中实例化您的视图。这将有以下顺序:
- 应用启动
- 模块启动
- 查看实例化和注册
- 用户登录
- LoginEvent 被拦截
- 查看开关
以下示例为您提供了一些概要(尚未经过测试,但在结构上应该是有效的):
public class ModuleInit : IModule
{
.....
CompositionContainer container;
IRegionManager regionManager;
[ImportingConstructor]
public ModuleInit(CompositionContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
public void Initialize()
{
var myView = this.container.GetExportedValue<MyView>();
regionManager.RegisterViewWithRegion("myregion", () => myView);
}
}
TL;DR 有没有办法强制 MEF Prism 容器在 View Disovery 实例化之前实例化 class?即在 regionManager.RegisterViewWithRegion
我有一个用户登录的业务流程,然后我开始一些数据库读取。 LoginEvent
注册到 EventAggregator
以便应用程序的其他部分可以听到它。问题是我的模型 MyModel
仅在依赖视图注册后才实例化,这当然发生在 之后 登录事件已经过去。我可以这样做 MyModel
的构造函数,但感觉很草率。
当前进程
1. User logs in
2. LoginEvent is dispatched
2. View switches to MyView
3. MyModel is instantiated and listens for LoginEvent that will never be dispatched
期望的过程
1. MyModel is instantiated and listens for LoginEvent
2. User Logs in
3. LoginEvent is dispatched
4. MyModel hears LoginEvent and kicks of data read.
非常感谢对此的任何帮助。
提前实例化您的视图,以便它可以侦听事件。您可以按照 prism 文档中的描述使用 Module concepts 在模块 Initialize 事件中实例化您的视图。这将有以下顺序:
- 应用启动
- 模块启动
- 查看实例化和注册
- 用户登录
- LoginEvent 被拦截
- 查看开关
以下示例为您提供了一些概要(尚未经过测试,但在结构上应该是有效的):
public class ModuleInit : IModule
{
.....
CompositionContainer container;
IRegionManager regionManager;
[ImportingConstructor]
public ModuleInit(CompositionContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
public void Initialize()
{
var myView = this.container.GetExportedValue<MyView>();
regionManager.RegisterViewWithRegion("myregion", () => myView);
}
}