Prism 文档为您提供了一个选项
通常,您会发现定义控制器或服务类来协调视图和视图模型类的实例化很有用。这种方法可以与依赖注入容器一起使用,例如 MEF 或 Unity,或者当视图显式创建其所需的视图模型时。
对于我的模块,我将执行以下
操作为模块内的服务创建一个接口
public interface ICustomModuleUiService
{
void ShowMainView();
void ShowExtraView();
}
同一模块中的生产实现:
class CustomModuleUiService : ICustomModuleUiService
{
private readonly IEventAggregator _eventAggregator;
public CustomModuleUiService(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
public void ShowMainView()
{
var ddsViewModel = new DdsViewModel(_eventAggregator, this);
DdsForm form = new DdsForm();
form.DataContext = ddsViewModel;
form.Show();
}
public void ShowExtraView()
{
//some code here
}
}
最后是模块代码
[ModuleExport("DssModule", typeof(DssModuleImpl))]
public class DssModuleImpl : IModule
{
private readonly IEventAggregator _eventAggregator;
private ICustomModuleUiService _uiService;
[ImportingConstructor]
public DssModuleImpl(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_uiService = new CustomModuleUiService(_eventAggregator);
}
public void Initialize()
{
_eventAggregator.GetEvent<OpenDdsFormEvent>().Subscribe(param => _uiService.ShowMainView());
}
}
使用这种方法我会得到
- ViewModel 可以进行单元测试
- 我可以通过替换 ICustomModuleUiService 的实现来动态更改对 OpenDdsFormEvent 的反应