使用模板10的依赖注入

时间:2016-06-24 23:51:55

标签: c# dependency-injection unity-container template10

我正在尝试将使用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());

其中ContainerUnityContainer个实例。我的问题是,当我尝试在另一个页面上注入依赖项时,我得到一个NullReferenceException,因为_payeesRepositorynull。在我看来,没有调用依赖注入的构造函数,如果我删除默认构造函数,那么我得到一个错误。有没有人让Unity使用模板10,可能有任何建议我可能会缺少什么?

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

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

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

1 个答案:

答案 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不支持配置文件(哈哈!)

我希望它能为您节省时间。