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

sen*_*ale 2 c# dependency-injection portable-class-library xamarin.forms

我想DependencyServiceXamarin.Forms一个Portable Class Library.在这种情况下,PCL是我的业务逻辑,因此,我无权访问也不想Xamarin.Forms在此项目中安装.

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

_login = DependencyService.Get<ILogin>();
Run Code Online (Sandbox Code Playgroud)

SimpleContainer用来注册我的服务.

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

Pet*_*ete 7

如果您不想安装Xamarin.Forms在您的计算机中,PCL您仍然可以针对您的平台特定实施进行编程PCL.

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

_login = DependencyService.Get<ILogin>();
Run Code Online (Sandbox Code Playgroud)

然而,这会产生依赖性Xamarin.Forms.

为了解决这个问题,你可以实现你的界面ILoginPCL.

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

选项1:创建一个单一的全局实例,您的每个调用PCL都会通过

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

public static MyGlobal
{
    public static ILogin MyLoginGlobalInstance;
}
Run Code Online (Sandbox Code Playgroud)

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

MyPCLProject.MyGlobal.MyLoginGlobalInstance = new Login();
Run Code Online (Sandbox Code Playgroud)

通过在本地平台特定项目上创建它并在其中进行设置PCL,您可以PCL根据您的界面访问实例ILogin,如下所示: -

MyPCLProject.MyGlobal.MyLoginGlobalInstance.{some interface member}
Run Code Online (Sandbox Code Playgroud)

选项2:每次在您的平台中创建特定于平台的类实例的新实例PCL.

但是,如果您希望每次需要时创建特定于平台的类的新实例,则PCL可以执行以下操作.

在您PCL创建以下内容: -

public static MyGlobal
{
    public static Func<ILogin> CreateNewInstance_Login;
}
Run Code Online (Sandbox Code Playgroud)

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

MyPCLProject.MyGlobal.CreateNewInstance_Login = new Func<ILogin>(()=>
{
    return new Login();
}
Run Code Online (Sandbox Code Playgroud)

然后消耗,创造一个新的实例您在每个时间PCL创建通过调用一个新的实例: -

ILogin objMyLoginInstance = MyPCLProject.MyGlobal.CreateNewInstance_Login();

objMyLoginInstance.{some interface member}
Run Code Online (Sandbox Code Playgroud)