2016-06-24 38 views
1

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

在我的旧的Windows 8.1的应用程序,存在棱镜Resolve方法,我会override这样的:

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

的模板10方法的签名是

public override INavigable ResolveForPage(Page page, NavigationService navigationService) 

所以我不完全确定如何将其转换。我已经注册了我的OnInitializeAsync库在我App.xaml.cs,像这样:

Container.RegisterType<IPayeesRepository, PayeesRepository>(new ContainerControlledLifetimeManager()); 

ContainerUnityContainer实例。我的问题是,当我尝试在另一个页面上注入依赖项时,我得到一个NullReferenceException,因为_payeesRepositorynull。在我看来,像依赖注入的构造函数没有被调用,如果我删除默认的构造函数,那么我得到一个错误。有没有人得到团结合作与模板10,可能有什么建议我可能会失踪?

我也使用Dependency属性,像这样尝试:

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

但是,这并不工作。好像IPayeesRepository只是没有被实例化,但我并不确定。在我的Windows 8.1应用程序中,它永远不会被明确实例化,所以我有一种感觉,它与不覆盖Resolve方法有关。

+0

配音stylee,我目前正在处理相同的问题,我不得不说,有这个ResolveForPage方法的例子缺乏...如果我找到一个解决方案,我会让你知道。 – Juan

回答

1

我做了它的工作(但在我的情况下,我有另一个讨厌的问题,我会在稍后提及,也可能在SO quiestion)。

一方面,the Ask Too Much's answer to this question引导我用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<MainPageViewModel>(); 
     //(AppController.UnityContainer as UnityContainer).Resolve<INavigable>(); 
    } 
    else 
     return base.ResolveForPage(page, navigationService); 
} 

但你还必须:

从页面移除XAML <Page.DataContext>。从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    
} 

而这一切,它应该为你工作。

I updated the wiki在一段时间内具有相同的信息...此外,让我们知道我使它与Unity一起工作,并使用MVVMLight.SimpleIoC以及相同的结果,由于IShapeService真正是一个位于PCL库中的WCF代理,System.PlatformNotSupportedException,我必须重构因为我只是意识到,UWP不支持配置文件(哈哈!)

我希望它可以帮助并节省您的时间。