Xamarin依赖服务问题

时间:2014-11-27 14:33:38

标签: c# dependency-injection xamarin xamarin.forms

在Xamarin Forms中,我有一个这样的解决方案:

Solution
 |- Libraries
 |   |- IInterface.cs
 |   |- Etc.
 |
 |- Libraries.iOS
 |   |- Interface.cs
 |   |- Etc.
 |
 |- Forms.App
 |   |- App.cs
 |   |- Etc.
 |
 |- Forms.App.iOS
 |   |- Etc.
  • Forms.App.iOS引用了Libraries.iOS
  • Forms.App引用库
  • Libraries.iOS引用库
  • Forms.App.iOS引用Forms.App

IInterface.cs

namespace a
{
  public interface IInterface
  {
    void Function ();
  }
}

Interface.cs

[assembly: Xamarin.Forms.Dependency(typeof(a.Interface))]
namespace a
{
  public class Interface : IInterface
  {
    public void Function ()
    {
      return;
    }
  }
}

App.cs

namespace a
{
  public class App
  {
    public static Page GetMainPage ()
    {
      var inter = DependencyService.Get<IInterface> (); // This is always null.
      return new ContentPage { 
        Content = new Label {
        Text = "Hello, Forms!",
        VerticalOptions = LayoutOptions.CenterAndExpand,
        HorizontalOptions = LayoutOptions.CenterAndExpand,
        },
      };
    }
  }
}

如何让依赖服务找到我的接口实现? 我需要将它们放在一个单独的项目中,因为我需要在不同的项目中使用相同的实现。

6 个答案:

答案 0 :(得分:7)

我有

[assembly: Dependency(typeof(TestService.IMyService))]

,我应该在哪里

[assembly: Dependency(typeof(TestService.iOS.MyService))]

所以总是采用实现而不是平台特定代码中的接口!否则你得到

  

System.MissingMethodException:找不到[Interface]

的默认构造函数

答案 1 :(得分:5)

添加更多信息。 它似乎是与库中的链接相关的错误,它定义了依赖服务,如here所述。

我通过手动实例化依赖服务的iOS实现解决了这个问题。

在AppDelegate.cs的iOS项目FinishedLaunching方法中,创建iOS依赖服务实现的对象,例如

var obj = new Company.Project.iOS.NativeImplementation_iOS ();

这对我有用。

答案 2 :(得分:4)

这是因为您的Interface.cs实现没有空构造函数。

要使DependencyService工作,你必须有一个空的构造函数,如下所示:

public Interface(){}

您的Forms.App解决方案必须引用包含接口声明的解决方案。

答案 3 :(得分:3)

如果您的依赖项为null,则另一个原因可能是您的类型被命名为您的服务,并且在Dependency中声明了错误的类型。至少对我来说就是这样。

答案 4 :(得分:2)

通过使用空Init方法创建静态类来解决它。并在AppDelegate.FinishedLaunching方法的开头调用该方法。

答案 5 :(得分:1)

也许确保您引用PCL库和跨平台库

Forms.App.iOS
   references - Libraries
   references - Libraries.iOS

这对我有用