sen*_*ale 2 c# dependency-injection portable-class-library xamarin.forms
我想DependencyService用Xamarin.Forms一个Portable Class Library.在这种情况下,PCL是我的业务逻辑,因此,我无权访问也不想Xamarin.Forms在此项目中安装.
我在业务逻辑中尝试做的是:
_login = DependencyService.Get<ILogin>();
Run Code Online (Sandbox Code Playgroud)
我SimpleContainer用来注册我的服务.
因此,我的问题是,Service Locator我可以在我的业务逻辑项目中使用它吗?
如果您不想安装Xamarin.Forms在您的计算机中,PCL您仍然可以针对您的平台特定实施进行编程PCL.
通常,就像您提到的那样,您可以使用以下内容访问PCL项目中特定于平台的类实例: -
_login = DependencyService.Get<ILogin>();
Run Code Online (Sandbox Code Playgroud)
然而,这会产生依赖性Xamarin.Forms.
为了解决这个问题,你可以实现你的界面ILogin中PCL.
然后,您将使用以下任一项创建静态类,具体取决于它是否为全局引用(仅存在一个实例),或者是否要实例化特定于平台的类实现的新实例以在PCL项目中使用: -
选项1:创建一个单一的全局实例,您的每个调用PCL都会通过
为此,请将以下内容添加到PCL: -
public static MyGlobal
{
public static ILogin MyLoginGlobalInstance;
}
Run Code Online (Sandbox Code Playgroud)
然后,在初始化特定于平台的iOS和Android项目时,您可以在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)
| 归档时间: |
|
| 查看次数: |
2320 次 |
| 最近记录: |