Xamarin.Forms 可移植 class 中的 C# DependencyService

C# DependencyService in Xamarin.Forms portable class

我想在 Portable Class Library 中使用 DependencyService 使用 Xamarin.Forms。在这种情况下,PCL 是我的业务逻辑,因此,我无法访问也不想在该项目中安装 Xamarin.Forms

我在业务逻辑中试图做的是:

_login = DependencyService.Get<ILogin>();

我正在使用 SimpleContainer 注册我的服务。

因此我的问题是,Service Locator 我可以在我的业务逻辑项目中使用哪个?

不清楚你到底想达到什么目的,但我认为,由于你在项目设计中的选择,实现服务的程序集不依赖于 Xamarin.Forms,因此你无法注册它们来自程序集,具有 [Dependency] 属性。

作为替代方案,您可以使用 DependencyService.Register<T> (); 在 DependencyService 中注册服务。注册服务后,您可以通过调用 DependencyService.Get<T> ();

来访问它

根据您的解决方案架构,它可能对您有帮助。

如果您不想在 PCL 中安装 Xamarin.Forms,您仍然可以在 PCL.

中针对特定于平台的实现进行编程

通常,就像您提到的那样,您可以使用以下方式访问 PCL 项目中特定于平台的 class 实例:-

_login = DependencyService.Get<ILogin>();

然而,这会产生对 Xamarin.Forms 的依赖。

要解决这个问题,您可以在 PCL.

中实现接口 ILogin

然后您将使用以下之一创建静态 class,具体取决于它是否是全局引用(只有一个实例存在),或者您是否想要平台的新实例-为在 PCL 项目中使用实例化的特定 class 实现:-

选项 1:创建一个全局实例,PCL 中的每个调用都经过

为此,请将以下内容添加到您的 PCL:-

public static MyGlobal
{
    public static ILogin MyLoginGlobalInstance;
}

然后在你的平台特定 iOSAndroid 项目的初始化中你可以设置这个global 属性 在你的 PCL 匹配在每个特定于平台的项目中创建的新实例,例如:-

MyPCLProject.MyGlobal.MyLoginGlobalInstance = new Login();

通过在本地特定平台项目上创建它,并在PCL中设置它,然后您可以访问PCL中的实例根据您在 ILogin 中定义的界面:-

MyPCLProject.MyGlobal.MyLoginGlobalInstance.{some interface member}

选项 2:每次在 PCL.

中创建平台特定 class 实例的新实例

但是,如果您想在每次需要时创建特定平台 class 的新实例,在您的 PCL 中,您可以执行以下操作。

在您的 PCL 中创建以下内容:-

public static MyGlobal
{
    public static Func<ILogin> CreateNewInstance_Login;
}

然后,在您的平台特定项目中,您可以使用以下方式初始化此函数:-

MyPCLProject.MyGlobal.CreateNewInstance_Login = new Func<ILogin>(()=>
{
    return new Login();
}

然后每次在 PCL 中使用并创建 一个新实例 您通过调用创建一个新实例:-

ILogin objMyLoginInstance = MyPCLProject.MyGlobal.CreateNewInstance_Login();

objMyLoginInstance.{some interface member}