内容简介:PlatInfoSap2程序中说明的技术是否可以在具有可移植类库的解决方案中实现? 起初,它似乎不可能。 虽然应用程序项目一直调用库,但是除了事件或回调函数的上下文之外,库通常不能调用应用程序。 PCL与独立于设备的.NET版本捆绑在一起,只能在其自身或其他可能引用的PCL中执行代码。但是等待:当Xamarin.Forms应用程序运行时,它可以使用.NET反射来访问自己的程序集和程序中的任何其他程序集。这意味着PCL中的代码可以使用反射来访问存在于引用PCL的平台程序集中的类。当然,这些类必须定义
依赖服务和可移植类库
PlatInfoSap2程序中说明的技术是否可以在具有可移植类库的解决方案中实现? 起初,它似乎不可能。 虽然应用程序项目一直调用库,但是除了事件或回调函数的上下文之外,库通常不能调用应用程序。 PCL与独立于设备的.NET版本捆绑在一起,只能在其自身或其他可能引用的PCL中执行代码。
但是等待:当Xamarin.Forms应用程序运行时,它可以使用.NET反射来访问自己的程序集和程序中的任何其他程序集。这意味着PCL中的代码可以使用反射来访问存在于引用PCL的平台程序集中的类。当然,这些类必须定义为公共类,但这只是唯一的要求。
在开始编写利用此技术的代码之前,您应该知道此解决方案已经以名为Dependency Service的Xamarin.Forms类的形式存在。此类使用.NET反射来搜索应用程序中的所有其他程序集(包括特定平台程序集本身),并提供对特定于平台的代码的访问。
DisplayPlatformInfo解决方案中说明了DependencyService的使用,该解决方案使用可移植类库作为共享代码。您可以通过在PCL项目中定义接口类型来开始使用DependencyService的过程,该接口类型声明要在平台项目中实现的方法的签名。这是IPlatformInfo:
点击( 此处 )折叠或打开
- namespace DisplayPlatformInfo
- {
- public interface IPlatformInfo
- {
- string GetModel ( ) ;
- string GetVersion ( ) ;
- }
- }
你以前见过这两种方法。 它们与PlatInfoSap2中平台项目中的PlatformInfo类中实现的方法相同。
以与PlatInfoSap2非常相似的方式,DisplayPlatformInfo中的所有三个平台项目现在必须具有实现IPlatformInfo接口的类。 这是iOS项目中的类,名为PlatformInfo:
点击( 此处 )折叠或打开
- using System ;
- using UIKit ;
- using Xamarin . Forms ;
- [ assembly : Dependency ( typeof ( DisplayPlatformInfo . iOS . PlatformInfo ) ) ]
- namespace DisplayPlatformInfo . iOS
- {
- public class PlatformInfo : IPlatformInfo {
- UIDevice device = new UIDevice ( ) ;
- public string GetModel ( )
- {
- return ( device . Model . ToString ( ) ) ;
- }
- public string GetVersion ( )
- {
- return ( String . Format ( "{0} {1}" , device . SystemName ,
- device . SystemVersion ) ) ;
- }
- }
- }
此类不是直接从PCL引用的,因此命名空间名称可以是您想要的任何名称。 在这里,它设置为与iOS项目中的其他代码相同的命名空间。 班级名称也可以是您想要的任何名称。 无论您如何命名,该类必须显式实现PCL中定义的IPlatformInfo接口:
点击( 此处 )折叠或打开
publicclassPlatformInfo:IPlatformInfo
此外,必须在命名空间块之外的特殊属性中引用此类。 您将在using指令后面的文件顶部附近看到它:
点击( 此处 )折叠或打开
[assembly:Dependency(typeof(DisplayPlatformInfo.iOS.PlatformInfo))]
定义此Dependency属性的DependencyAttribute类是Xamarin.Forms的一部分,专门用于与DependencyService连接。 参数是平台项目中类的Type对象,可供PCL访问。 在这种情况下,它就是这个PlatformInfo类。 此属性附加到平台程序集本身,因此在PCL中执行的代码不必搜索整个库以查找它。
这是PlatformInfo的Android版本:
点击( 此处 )折叠或打开
- using System ;
- using Android . OS ;
- using Xamarin . Forms ;
- [ assembly : Dependency ( typeof ( DisplayPlatformInfo . Droid . PlatformInfo ) ) ]
- namespace DisplayPlatformInfo . Droid
- {
- public class PlatformInfo : IPlatformInfo {
- public string GetModel ( )
- {
- return ( String . Format ( "{0} {1}" , Build . Manufacturer ,
- Build . Model ) ) ;
- }
- public string GetVersion ( )
- {
- return ( Build . VERSION . Release . ToString ( ) ) ;
- }
- }
- }
这是UWP项目的一个:
点击( 此处 )折叠或打开
- using System ;
- using Windows . Security . ExchangeActiveSyncProvisioning ;
- using Xamarin . Forms ;
- [ assembly : Dependency ( typeof ( DisplayPlatformInfo . UWP . PlatformInfo ) ) ]
- namespace DisplayPlatformInfo . UWP
- {
- public class PlatformInfo : IPlatformInfo {
- EasClientDeviceInformation devInfo = new EasClientDeviceInformation ( ) ;
- public string GetModel ( )
- {
- return ( String . Format ( "{0} {1}" , devInfo . SystemManufacturer ,
- devInfo . SystemProductName ) ) ;
- }
- public string GetVersion ( )
- {
- return ( devInfo . OperatingSystem ) ;
- }
- }
- }
Windows 8.1和Windows Phone 8.1项目具有类似的文件,这些文件仅由命名空间不同。
然后,PCL中的代码可以使用DependencyService类访问特定平台的IPlatformInfo实现。 这是一个带有三个公共方法的静态类,其中最重要的是名为Get。 Get是一个泛型方法,其参数是您定义的接口,在本例中为IPlatformInfo。
点击( 此处 )折叠或打开
IPlatformInfo platformInfo=DependencyService.Get<IPlatformInfo>();
Get方法返回实现IPlatformInfo接口的特定于平台的类的实例。 然后,您可以使用此对象进行特定于平台的调用。 这在DisplayPlatformInfo项目的代码隐藏文件中得到了证明:
点击( 此处 )折叠或打开
- namespace DisplayPlatformInfo
- {
- public partial class DisplayPlatformInfoPage : ContentPage {
- public DisplayPlatformInfoPage ( )
- {
- InitializeComponent ( ) ;
- IPlatformInfo platformInfo = DependencyService . Get < IPlatformInfo > ( ) ;
- modelLabel . Text = platformInfo . GetModel ( ) ;
- versionLabel . Text = platformInfo . GetVersion ( ) ;
- }
- }
- }
Dependency Service缓存通过Get方法获取的对象的实例。 这加速了Get的后续使用,并且还允许接口的平台实现维护状态:平台实现中的任何字段和属性将在多个Get调用中保留。 这些类还可以包含事件或实现回调方法。
与PlatInfoSap2项目中显示的方法相比,依赖服务只需要更多的开销,并且由于各个平台类实现了在共享代码中定义的接口,因此更加结构化。
DependencyService不是在PCL中实现特定于平台的调用的唯一方法。 Adventurous开发人员可能希望使用依赖注入技术来配置PCL以调用平台项目。 但是DependencyService非常易于使用,它消除了在Xamarin.Forms应用程序中使用共享资产项目的大多数原因。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 第九章:特定于平台的API调用(四)
- TypeScript 3.6 Beta 发布,稳定版定于8月底推出
- Ubuntu 19.10 Beta 发布,正式版本定于 10 月份
- Ubuntu 19.04 Beta 发布,正式版定于 4 月
- Debian GNU / Linux 10 Buster 定于7月6日发布
- 直观讲解-RPC调用和HTTP调用的区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)
左程云 / 电子工业出版社 / 109.00元
《程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)》是一本程序员代码面试"神书”!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近300道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到接近万无一失。"刷”完本书后,你就是"题王”!《程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)》......一起来看看 《程序员代码面试指南:IT名企算法与数据结构题目最优解(第2版)》 这本书的介绍吧!