【问题标题】:Dependency Injection using Template 10使用模板 10 进行依赖注入
【发布时间】:2016-10-27 16:13:08
【问题描述】:

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

在我的旧 Windows 8.1 应用程序中,Prism 中有一个 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。在我看来,没有调用具有依赖注入的构造函数,如果我删除默认构造函数,则会出现错误。有没有人让 Unity 使用模板 10,可能对我可能遗漏的内容有任何建议?

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

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

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

【问题讨论】:

  • dub stylee,我目前正在处理同样的问题,我不得不说缺少关于此 ResolveForPage 方法的示例...如果我找到解决方案,我会让你知道。

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


【解决方案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 中删除 &lt;Page.DataContext&gt;。 从page.xaml.cs中去掉构造函数,我的MainPage.xaml.cs是这样的

public sealed partial class MainPage : Page
{
    MainPageViewModel _viewModel;

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

在你的虚拟机上注入你的依赖:

public MainPageViewModel(IShapeService shapeService)
{     
   // this is just a POC            
}

就是这样,它应该适合你。

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

希望对您有所帮助并节省您的时间。

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 2021-03-23
    • 2017-03-23
    • 2015-09-26
    • 2014-01-19
    • 2014-03-25
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多