Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何减少平台特定项目之间的代码重复?_C#_Xamarin_Cross Platform_Xamarin.forms_Code Duplication - Fatal编程技术网

C# 如何减少平台特定项目之间的代码重复?

C# 如何减少平台特定项目之间的代码重复?,c#,xamarin,cross-platform,xamarin.forms,code-duplication,C#,Xamarin,Cross Platform,Xamarin.forms,Code Duplication,我正在开发一个Xamarin.Forms解决方案,它使用PCL库在我的Android和iOS项目之间共享代码。由于大多数UI和逻辑代码都可以保存在一个地方,所以这在很大程度上是很好的。当然,我使用DependencyService创建了一些特定于平台的类,并将它们链接到PCL,这对于大多数类来说都很好,因为平台之间的代码有很大的不同(例如UI布局/外观) 但是,有一个子类使用PCL项目不可用的各种名称空间(特别是System.Data名称空间)。为了绕过这个限制,我必须为每个类编写Depende

我正在开发一个Xamarin.Forms解决方案,它使用PCL库在我的Android和iOS项目之间共享代码。由于大多数UI和逻辑代码都可以保存在一个地方,所以这在很大程度上是很好的。当然,我使用
DependencyService
创建了一些特定于平台的类,并将它们链接到PCL,这对于大多数类来说都很好,因为平台之间的代码有很大的不同(例如UI布局/外观)

但是,有一个子类使用PCL项目不可用的各种名称空间(特别是System.Data名称空间)。为了绕过这个限制,我必须为每个类编写DependencyService。我担心的是Android和iOS之间的代码完全相同,只差一两行。代码非常复杂,我不想在需要时记得更新两次


考虑到由于必要的名称空间不可用,我无法将代码放入PCL中,有没有办法减少这两个项目之间的代码复制量?

我能够使用共享项目消除所有重复的代码(如@matthewrdev所建议的)。不过,这个过程比我预期的要复杂一些,所以我将添加一个关于我所做工作的指南

  • 创建一个新的Xamarin.Forms共享项目。(不幸的是,我只能选择创建一个“空白应用(共享)”项目,该项目附带预生成的Android和iOS项目。我删除了这些项目,因为我已经有了必要的平台项目。)

  • 将所有重复的代码添加到共享项目中。您可能需要更新名称空间。对于您需要运行的特定于平台的任何代码,您必须使用
    \if\uuuuu ANDROID\uuuu
    \if\uuu IOS\uuuu
    预处理器指令

  • 在平台项目中添加对共享项目的引用(在我的例子中是Android和iOS)。在VS2013中,这有点复杂,因为您(显然)无法向共享项目添加引用。您要么必须手动修改.csproj文件(有关详细信息,请参阅),要么可以使用VS2013的扩展名

  • 确保将
    \uuuuuu ANDROID\uuuu
    \uuuuuiOS\uuuuu
    条件编译符号添加到平台项目中。为此,您需要打开项目的属性,转到“Build”选项卡,并在显示“conditional compilation symbols”的位置添加符号


  • 这些说明适用于Visual Studio 2013,但步骤与Xamarin Studio和VS2015类似

    我建议在您的体系结构中插入一个共享项目。对于需要依赖于平台和/或使用平台API的代码,我将继续使用由接口抽象的平台类。但是,如果您有可以在这些平台类之间共享的代码,则可以将该代码放在共享项目中,并让平台类引用它

    我以前在SQlite访问中使用过这种模式。我需要低级别的ADO.net支持,这意味着从SqliteDataReader手动映射数据。这种逻辑在平台之间很常见,但在PCL中无法实现。因此,我有一个用于数据映射的SharedProject,我的平台数据库实现引用了该项目

    请参见下面的示例类图


    我使用了
    诱饵和开关方法(),但通过创建两个特定于平台的项目,在特定于平台的程序集中使用相同的代码文件,包括/通过共享项目链接每个项目中的代码文件,然后对平台之间更改的几行代码使用平台编译器指令。。。因此,通过将PCL样式代码与平台指令混合,您可以跳过PCL需要的复制代码…(续)。。。如果您有非常大的接口定义或快速变化的接口定义,为了节省更新PCL伪签名的时间,我使用T4模板定义并生成特定于接口和平台的部分类…@sushingover nice技巧。要想管理那些只有几行代码差异的大型代码库,一个有效的方法是将有问题的代码放入一个共享项目中,如果定义了该代码,就可以使用它#ifdef并不是最简洁的方法,但是如果整个代码体中只有一两行代码,那么成本就相当低。