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;
}
然后在你的平台特定 iOS 和 Android 项目的初始化中你可以设置这个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}
我想在 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;
}
然后在你的平台特定 iOS 和 Android 项目的初始化中你可以设置这个global 属性 在你的 PCL
匹配在每个特定于平台的项目中创建的新实例,例如:-
MyPCLProject.MyGlobal.MyLoginGlobalInstance = new Login();
通过在本地特定平台项目上创建它,并在PCL
中设置它,然后您可以访问PCL
中的实例根据您在 ILogin
中定义的界面:-
MyPCLProject.MyGlobal.MyLoginGlobalInstance.{some interface member}
选项 2:每次在 PCL
.
但是,如果您想在每次需要时创建特定平台 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}