我正在尝试将使用Prism / Unity开发的旧Windows 8.1应用程序中的一些代码迁移到使用Template 10和Unity的新UWP应用程序。我在模板10 here的文档中看到,您可以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)
所以我不确定如何转换它。我已在我的OnInitializeAsync
App.xaml.cs
中注册了我的存储库,如下所示:
Container.RegisterType<IPayeesRepository, PayeesRepository>(new ContainerControlledLifetimeManager());
其中Container
是UnityContainer
个实例。我的问题是,当我尝试在另一个页面上注入依赖项时,我得到一个NullReferenceException
,因为_payeesRepository
是null
。在我看来,没有调用依赖注入的构造函数,如果我删除默认构造函数,那么我得到一个错误。有没有人让Unity使用模板10,可能有任何建议我可能会缺少什么?
我也尝试使用Dependency
属性,如下所示:
[Dependency]
private IPayeesRepository _payeesRepository { get; set; }
但这也不起作用。好像IPayeesRepository
似乎没有被实例化,但我不确定。在我的Windows 8.1应用程序中,它永远不会被显式实例化,所以我觉得它与不覆盖Resolve
方法有关。
答案 0 :(得分:1)
我让它发挥作用(但在我的情况下,我还有另一个令人讨厌的问题,我稍后会提及,也可能在SO静止中)。
一方面,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真的是一个System.PlatformNotSupportedException是一个在PCL库中的WCF代理,我必须重构,因为我只是意识到UWP不支持配置文件(哈哈!)
我希望它能为您节省时间。