首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模板10的依赖注入

使用模板10的依赖注入
EN

Stack Overflow用户
提问于 2016-06-24 23:51:54
回答 1查看 2K关注 0票数 1

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

在我以前的Windows8.1应用程序中,有一个棱镜中的Resolve方法,我希望override这样做:

代码语言:javascript
复制
protected override object Resolve(Type type)
{
    return Container.Resolve(type);
}

模板10方法的签名是

代码语言:javascript
复制
public override INavigable ResolveForPage(Page page, NavigationService navigationService)

所以我不太清楚该如何转换。我已经在OnInitializeAsync中在App.xaml.cs中注册了存储库,如下所示:

代码语言:javascript
复制
Container.RegisterType<IPayeesRepository, PayeesRepository>(new ContainerControlledLifetimeManager());

其中Container是一个UnityContainer实例。我的问题是,当我试图在另一个页面上注入依赖项时,我会得到一个NullReferenceException,因为_payeesRepositorynull。在我看来,没有调用带有依赖项注入的构造函数,如果删除默认构造函数,则会得到一个错误。有没有人得到团结与模板10的工作,可能有任何建议,我可能会错过什么?

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

代码语言:javascript
复制
[Dependency]
private IPayeesRepository _payeesRepository { get; set; }

但这也行不通。看起来IPayeesRepository只是没有被实例化,但我不太确定。在我的Windows8.1应用程序中,它从未被显式实例化,所以我觉得它与不覆盖Resolve方法有关。

EN

回答 1

Stack Overflow用户

发布于 2016-08-18 07:25:40

我让它发挥作用(但在我的例子中,我有另一个令人讨厌的问题,我稍后会提到,而且可能也是如此。)

一方面,对这个问题的回答引导我使用ViewModel的DI解决这个问题。

在App.xaml.cs中:

代码语言:javascript
复制
public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args)
{
    // long-running startup tasks go here
    AppController.Initialize();
    await Task.CompletedTask;
}

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

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

代码语言:javascript
复制
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如下所示

代码语言:javascript
复制
public sealed partial class MainPage : Page
{
    MainPageViewModel _viewModel;

    public MainPageViewModel ViewModel
    {
        get { return _viewModel ?? (_viewModel = (MainPageViewModel)DataContext); }
    }    
}

注入VM上的依赖项:

代码语言:javascript
复制
public MainPageViewModel(IShapeService shapeService)
{     
   // this is just a POC            
}

仅此而已,它应该对你有用。

我更新了维基有同样的信息.另外,让您知道,我使它与团结和MVVMLight.SimpleIoC的结果相同,System.PlatformNotSupportedException由于IShapeService实际上是一个WCF代理,它位于一个PCL库中,我必须重构它,因为我刚刚意识到UWP不支持配置文件(lol!)

希望它能帮你节省时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38023604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档