使用模板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());
Container
是UnityContainer
实例。 我的问题是,当我尝试将dependency injection另一个页面时,我得到一个NullReferenceException
因为_payeesRepository
为null
。 在我看来,没有调用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!)
我希望它有所帮助并节省您的时间。