如何使用Prism for Xamarin进行依赖注入?

时间:2018-06-10 00:51:52

标签: prism

我有一个应用程序,我正在移植到Prism(来自XamVvm)。我正在使用DryIoC。

我的界面看起来像这样

[assembly: Dependency(typeof(IJoinCongregation))]
namespace MapManPrism.Services
{
public interface IJoinCongregation
{
    Task<bool> JoinCongregation(int Identifier, int PIN);
    Task<bool> CheckForMapUpdates();
    Task<Models.API.Publisher> PostPublisher(string name, string phone, int congregationid);

}

实现此接口的类看起来像这样

public class JoinCongregation : IJoinCongregation
{
    private readonly string JoinCongregationAction = $"{EnvironmentConfiguration.WebEndPoint}Congregations/AuthoriseCongregation";
    private readonly string RegisterPublisherAction = $"{EnvironmentConfiguration.WebEndPoint}Publisher/EnrolPublisher";


    private readonly IFileStorage _fileStorage;
    private readonly IDatabaseService _database;


    public JoinCongregation(IFileStorage fileStorage, IDatabaseService database)
    {
        //var container = new Container();
        //container.resolve
        _fileStorage = fileStorage;
        _database = database;
    }

但是,当我的构造函数代码在我的页面viewmodel(名为WelcomeWizardPageViewModel)中运行时,它无法解决IJoinCongregation的具体实现。这使得DryIoC在超出超时时抛出错误。

构造函数代码如下所示......

public WelcomeWizardPageViewModel(IJoinCongregation congregation)
    {
        //var container = new Container();
        //new DatabaseService(); // runs constructor code which we need
        _congregation = congregation;
 ...

我做错了什么?这些是我的猜测。

  1. 我未正确注册服务
  2. 我以错误的方式将这些服务提升到其他服务
  3. 通过在我的服务中使用[assembly:Dependency(typeof(IJoinCongregation))],我在某种程度上混合了Xamarin的DI和DryIoC的DI(我试过这个没有效果)
  4. 任何帮助都会所以非常感谢。谢谢。

    编辑:这些是服务首先注册的方式:

     protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.RegisterForNavigation<NavigationPage>();
                containerRegistry.RegisterForNavigation<MainPage>();
                containerRegistry.RegisterForNavigation<WelcomeWizardPage>();
                 containerRegistry.RegisterForNavigation<SettingsPage>();
                //containerRegistry.RegisterForNavigation<WelcomeWizard>();
                //containerRegistry.register
                //containerRegistry.RegisterType<IFileStorage, FileStorage>();
                containerRegistry.Register<ICartService, CartService>();
                containerRegistry.Register<IDatabaseService, DatabaseService>();
                containerRegistry.Register<IJoinCongregation, JoinCongregation>();
                containerRegistry.Register<IMapService, MapService>();
    
    
    
            }
    

1 个答案:

答案 0 :(得分:1)

最后,我只是忘记了注册一项从属服务。这就是我修复它的方法。

确定页面视图模型具有哪些依赖关系,然后在页面视图模型中将它们设置为null以验证页面视图模型是否正常工作以及自动视图模型解析。这是有效的,所以它必须是别的东西。

从页面视图模型的构造函数中取出两个服务。这也有效。

将一项服务添加回页面视图模型。这仍然有效。

向页面视图模型添加第二个服务,轮子脱落并且因DryIoC错误而崩溃。

导航到使其中断并检查其依赖关系的服务。

其中一个依赖项未在DryIoC中注册。添加它,生物叹息