如何解决使用Prism 7的WPF App:如何使用具有多个具体类的接口为VM注册和导航
我正在使用Prism 7创建WPF应用程序。在一种视图模型中,我试图注入一个称为IActivityService的接口。 IActivityService具有多个具体类,但出于问题的目的,请选择TestActivtyService和ExerciseActivityService。下面是我如何注册它们:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Register<IActivityService,TestActivtyService>(InstanceNames.TestActivtyService);
containerRegistry.Register<IActivityService,ExerciseActivityService>(InstanceNames.ExerciseActivityService);
containerRegistry.RegisterForNavigation<Shell,ShellViewModel>(ViewNames.Shell);
containerRegistry.RegisterForNavigation<Home,HomeViewModel>(ViewNames.Home);
containerRegistry.RegisterForNavigation<ActivityManagement,ActivityManagementViewModel>(ViewNames.TestManagement);
}
ActivityManagementViewModel具有使用IActivityService的构造函数。
private readonly IActivityService _activityService;
public ActivityManagementViewModel(IRegionManager regionManager,IActivityService activityService)
: base(regionManager)
{
this._activityService = activityService;
}
我无法导航到使用ActivityManagementViewModel的ActivityManagement视图。
private void NavigateToTesting()
{
//Navigate to ActivityManagement with TestActivtyService injected as IActivityService
RegionManager.RequestNavigate(RegionNames.MainRegion,ViewNames.ActivityManagement.GetUri());
}
private void NavigateToExercise()
{
//Navigate to ActivityManagement with ExerciseActivityService injected as IActivityService
RegionManager.RequestNavigate(RegionNames.MainRegion,ViewNames.ActivityManagement.GetUri());
}
问题
- 当我导航到ActivityManagement视图时,它总是使用注册的最后一个具体类作为IActivityService注入到ActivityManagementViewModel中。 为什么会这样?
- 如何在运行时使用选择的具体类导航至视图?
之所以要这样做,是因为该界面的每个具体实现的视图UI和要求都完全相同。区别在于具体类使用的数据和数据存储库。对我来说,为每个具体实现重新创建相同的精确视图和视图模型以相同的精确方式显示数据是没有意义的。在引入新的具体实现时,总是必须添加它们也是不好的。
如果我缺少某些东西,或者有更好的方法实现这一目标,请教育我。
解决方法
当您使用相同的接口统一注册多个类型而不命名时,最后一个将通过覆盖先前的类型而获胜。 如果使用命名进行注册,则只有命名注册和 no 默认注册,因此在解析视图模型时会出现错误。
如何在运行时使用选择的具体类导航至视图?
我将创建一个工厂并将其注入,例如:
internal class ActivityServiceFactory : IActivityServiceFactory
{
public IActivityService Create( ActivityServiceType activityServiceType )
{
switch (activityServiceType)
{
case ActivityServiceType.Test: return new TestActivtyService();
case ActivityServiceType.Exercise: return new ExerciseActivityService();
default: throw new IllegalArgumentException();
}
}
}
然后在视图模型中解析活动服务。根据需要调整工厂,例如parameters种不同的产品或单件产品。邪恶但合理的做法可能是将容器简单地注入工厂。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。