使用模板10的dependency injection

我正在尝试将使用Prism / Unity开发的旧Windows 8.1应用程序中的一些代码迁移到使用Template 10和Unity的新UWP应用程序。 我在这里的模板10的文档中看到,您可以override ResolveForPage方法。

在我的旧Windows 8.1应用程序中,Prism中有一个Resolve方法,我会override如下:

 protected override object Resolve(Type type) { return Container.Resolve(type); } 

Template 10方法的签名是

 public override INavigable ResolveForPage(Page page, NavigationService navigationService) 

所以我不确定如何转换它。 我在App.xaml.cs中的OnInitializeAsync中注册了我的存储库,如下所示:

 Container.RegisterType(new ContainerControlledLifetimeManager()); 

ContainerUnityContainer实例。 我的问题是,当我尝试将dependency injection另一个页面时,我得到一个NullReferenceException因为_payeesRepositorynull 。 在我看来,没有调用dependency injection的构造函数,如果我删除默认构造函数,那么我得到一个错误。 有没有人让Unity与模板10合作,可能有任何建议,我可能会失踪?

我也尝试使用Dependency属性,如下所示:

 [Dependency] private IPayeesRepository _payeesRepository { get; set; } 

但这也不起作用。 似乎IPayeesRepository只是没有被实例化,但我不确定。 在我的Windows 8.1应用程序中,它永远不会被显式实例化,所以我觉得它与不重写Resolve方法有关。

我做到了(但在我的情况下,我有另一个烦人的问题,我稍后会提到,也可能在SO静止中)。

一方面, Ask Too Much对这个问题的回答指导我用ViewModel的DI来解决这个问题。

在App.xaml.cs中:

 public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args) { // long-running startup tasks go here AppController.Initialize(); await Task.CompletedTask; } 

AppController是我配置应用程序的地方,包括容器。

接下来,在App.xaml.cs中:

 public override INavigable ResolveForPage(Page page, NavigationService navigationService) { if (page is MainPage) { return SimpleIoc.Default.GetInstance(); //(AppController.UnityContainer as UnityContainer).Resolve(); } else return base.ResolveForPage(page, navigationService); } 

但你还必须:

从页面XAML中删除 。 从page.xaml.cs中删除构造函数,我的MainPage.xaml.cs是这样的

 public sealed partial class MainPage : Page { MainPageViewModel _viewModel; public MainPageViewModel ViewModel { get { return _viewModel ?? (_viewModel = (MainPageViewModel)DataContext); } } } 

在VM上注入依赖项:

 public MainPageViewModel(IShapeService shapeService) { // this is just a POC } 

这就是全部,它应该适合你。

我用一段时间用相同的信息更新了wiki …另外,只是让你知道我使用Unity和MVVMLight.SimpleIoC同样的结果,因为IShapeService实际上是一个WCF的System.PlatformNotSupportedException我将不得不重构的PCL库中的代理,因为我只是意识到UWP不支持配置文件(lol!)

我希望它有所帮助并节省您的时间。