我正在开发一个Xamarin.Forms解决方案,该解决方案使用PCL库在我的Android和iOS项目之间共享代码。由于大多数UI和逻辑代码可以保存在一个地方,因此大部分工作都很好。当然,我创建了一些特定于平台的类,并使用DependencyService
链接到PCL,这对于大多数类来说都很好,因为平台之间的代码差异很大(例如,UI布局/外观)。
但是,有一个类子集利用了PCL项目不可用的各种命名空间(特别是System.Data命名空间)。为了解决这个限制,我必须为每个类编写一个DependencyService。我担心的是Android和iOS之间的代码完全相同,减去一两行。代码非常复杂,我不想在需要时记得更新它两次。
有没有办法可以减少这两个项目之间重复的代码量,考虑到由于必要的命名空间不可用而无法将代码放入PCL中?
答案 0 :(得分:1)
我建议在您的架构中插入一个共享项目。我将继续使用Interfaces抽象的平台类来获取需要与平台相关的代码和/或使用Platform API。但是,如果您有可以在这些平台类之间共享的代码,则可以将该代码放在共享项目中,并让Platform Classes引用它。
之前我曾使用过这种模式进行SQlite Access。我需要低级别的ADO.net支持,这意味着手动将数据从SqliteDataReader中映射出来。这种情况的逻辑在平台之间很常见,但不能用于PCL。所以我有一个SharedProject for Data Mapping,我的平台数据库实现引用了该项目。
请参阅下面的示例类图。
答案 1 :(得分:0)
我能够使用共享项目消除所有重复的代码(如@matthewrdev建议的那样)。然而,这个过程比我预期的要复杂一点,所以我会添加一个关于我所做的事情的指南。
创建一个新的Xamarin.Forms共享项目。 (不幸的是,我只能选择创建一个“空白应用程序(共享)”项目,该项目附带预先生成的Android和iOS项目。我删除了那些因为我已经拥有必要的平台项目。)
将所有重复的代码添加到共享项目中。您可能需要更新名称空间。对于您需要针对平台运行的任何代码,您必须使用#if __ANDROID__
或#if __IOS__
预处理程序指令。
在平台项目中添加对共享项目的引用(在我的例子中,Android和iOS)。在VS2013中,这有点复杂,因为您(显然)无法添加对共享项目的引用。您必须手动修改.csproj文件(有关详细信息,请参阅this answer),或者您可以使用VS2013的Shared Project Reference Manager扩展名。
确保将__ANDROID__
和__IOS__
条件编译符号添加到您的平台项目中。要执行此操作,您需要打开项目的属性,转到“构建”选项卡,然后将符号添加到“条件编译符号”。
这些说明适用于Visual Studio 2013,但Xamarin Studio和VS2015的步骤也类似。