我正在学习Prism 6.0.0,我遇到了AutoWireViewModel异常的问题。 如果我没有绑定到这个界面,我不知道如何注入IRegionRepository。
另外我正在使用Ninject和实体框架
整个项目在这里:https://github.com/PiotrKowalski93/PrismDemo
我正在学习:https://www.youtube.com/watch?v=ZfBy2nfykqY,他的代码工作正常,但他正在使用Prism 5.7.0
我想要的是在按下按钮后显示我的EmployeesView。
MainWindow.xaml中的我的容器
<ItemsControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
在启动应用程序期间抛出异常:
prism:ViewModelLocator.AutoWireViewModel="True"
My Bootstraper.cs
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
Container.RegisterTypeForNavigation<EmployeesView>("Employee");
}
}
我的App.xaml.cs文件:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Bootstrapper bs = new Bootstrapper();
bs.Run();
}
}
我的MainWindowViewModel.cs
private readonly IRegionManager _regionManager;
public DelegateCommand<string> NavigateCommand { get; set; }
public MainWindowViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
NavigateCommand = new DelegateCommand<string>(Navigate);
}
private void Navigate(string obj)
{
_regionManager.RequestNavigate("ContentRegion", obj);
}
感谢您的帮助!
答案 0 :(得分:1)
如果您查看Prism WPF的supported IoC containers,您会看到我们支持Ninject。为此,您可以使用Prism.Ninject包而不是Prism.Unity。
下一个逻辑步骤是用NinjectBootstrapper
类替换UnityBootstrapper
基类。我不熟悉Ninject,所以我不确定你是否必须注册所有类型,或者Ninject是否有办法自动解析未注册的类型。
另一个解决方案是用Unity替换你的Ninject以更接近样本,但这不是问题的一部分:)。 Ninject有官方支持,所以没有什么能阻止你选择熟悉的IoC容器。
额外注意:有些东西可以工作而其他东西不工作的原因是因为一些IoC容器(如Unity)可以在没有配置的情况下解析具体类型的实例,而其他的(如Autofac)允许使用一些额外的配置(如果是Autofac,则为AnyConcreteTypeNotAlreadyRegisteredSource
。)
答案 1 :(得分:0)
您应该使用引导程序的Unity容器注册您的服务,而不是从未用于解析的Ninject内核。 Unity不知道IHrService
应该解析为HrService
...尝试添加
Container.RegisterType<IHrService, HrService>();
到你的引导程序ConfigureContainer
。
编辑:此外,请务必从Prism 6中解析正确的IRegionManager
,即Prism.Regions.IRegionManager
。您的解决方案包含大量旧Prism组件的参考,您的使用包含来自那些的东西(比如Microsoft.Practices.Prism.Regions.IRegionManager
...)
答案 2 :(得分:0)
好的,所以设法搞清楚了:
我的队员里乱了。我删除了所有
Microsoft.Practices.Prism
Microsoft.Practices.Prism.MVVM
的DLL。
3.我重新安装了Prism软件包,我的Prism.WPF和Prism.Unity版本是6.x.x版,但我的Prism软件包是在5.x.x上。
Ovecourse我不得不将我的界面从Ninject模块的类映射移动到Unity模块中的Container Configuration。