Architecture 在Monodroid应用程序中重用Monotouch代码

Architecture 在Monodroid应用程序中重用Monotouch代码,architecture,mvp,xamarin.ios,xamarin.android,Architecture,Mvp,Xamarin.ios,Xamarin.android,我目前正在实现一个Monotouch应用程序,它最终将被移植到Monodroid。应用程序只是ODataWeb服务的客户端。不要太花哨或对性能要求太高 挑战在于尽可能多地重用代码。我知道Monotouch和Monodroid的UI API非常不同,但我希望重用数据抽象层和业务层 由于我的UI层遵循MVP模式,我还希望通过对每个视图的抽象表示进行编码来重用UI控制器。然而,我只能猜测,如果这将工作,因为我还没有被允许的单机器人测试 现在我的问题是: 你认为这种方法怎么样?这是一个好主意,还是仅仅

我目前正在实现一个Monotouch应用程序,它最终将被移植到Monodroid。应用程序只是ODataWeb服务的客户端。不要太花哨或对性能要求太高

挑战在于尽可能多地重用代码。我知道Monotouch和Monodroid的UI API非常不同,但我希望重用数据抽象层和业务层

由于我的UI层遵循MVP模式,我还希望通过对每个视图的抽象表示进行编码来重用UI控制器。然而,我只能猜测,如果这将工作,因为我还没有被允许的单机器人测试

现在我的问题是:

  • 你认为这种方法怎么样?这是一个好主意,还是仅仅因为IPhone和Android在UI概念上的差异而导致了一个平庸的应用程序

  • 您能否提供一些关于如何构造应用程序以最大限度地实现代码重用的提示

谢谢


Adrian

我尝试过做类似的事情——在我的例子中,因为我想使用VS和我所有的Windows开发工具来获得尽可能多的代码

然而,我恢复到只使用“通用”的模型层,并在Mac(即MonoDevelop)上执行UI层(控制器和视图)。对于我正在开发的相对较小的应用程序来说,所付出的努力是过度的,而且只有我一个人在开发它

此外,如果你是iPhone和/或Android新手,尝试做一些相对复杂的事情会使你更难找到样本或问题的答案。我发现自己的生活越来越艰难(当然是在我iPhone工作的早期)

当然,在不了解项目和业务模式的细节的情况下,很难给出任何具体的建议,但这些都是我的经验——它们都是值得的。

你认为这种方法怎么样?这是一个好主意,还是仅仅因为IPhone和Android在UI概念上的差异而导致了一个平庸的应用程序? 我想说的是后者,但您肯定可以重用大部分业务和域对象。Monodroid中使用了相同的MonoSQLite,因此应用程序的数据持久性部分(如果使用)是可重用的

我不会费心创建一个中间层用户界面——这两个界面完全不同。例如,在Android应用程序上,您有底部菜单,屏幕上可以包含6个按钮。在iPhone上,选项卡栏或工具栏中很可能没有6个按钮。为这做一个通用的模式对你没有多大帮助

另一个例子是ListView(UITableView)。他们完全不同。正如您所料,Monodroid实现忠实于它丑陋的Java姐妹。在安卓系统上,你不必使用苹果强加给你的大量间接寻址,只需使用一个简单的ArrayAdapter作为数据源——为更复杂的布局进行子类化

另一个需要注意的重要事项是,Android没有一个屏幕大小。您可以为其创建图像。字体大小不是绝对的

Android为您提供了类似于XAML和web的布局机制,在iPhone上,您没有那么幸运(或者更幸运,取决于您的看法),因为所有东西通常都是绝对定位的(他们可以这样做,因为它总是320x480)

您能否提供一些关于如何构造应用程序以最大限度地实现代码重用的提示? 我想你已经用不同的数据层和控制器覆盖了大部分。如果没有看到你的应用程序,很难说重新使用控制器有多容易(无论你是使用uitableview还是自定义ui),但是安卓的开发速度要快得多,我认为这应该是一项快速的任务


(我在Monodroid预览版上,还有一个MT应用程序)

我已经成功地为我的表示层实现了MVC模式,域模型、服务层、存储库和公共都是平台无关的。在我需要特定于平台的代码的地方,比如NetworkConnectionManager(我的名字),我使用#if#endif包装对象,或者在我需要进行单元测试的地方,我使用控制台应用程序进行所有单元测试,这与安卓完全相同,iPhone和Windows Phone项目,除了我遗漏了UI层,它是所有用户界面平台特定的crud。我还用Console define标记我的控制台,用Android define标记我的Android项目,这样我就可以执行#if#endif

我不得不说,它工作得很好,如果我能把我的整个MVC层放在控制台中进行单元测试,并让它在Android下工作,那么我很高兴它能在iPhone和Windows Phone下工作,因为控制台甚至没有接口。这是测试表示层通用性的完美方法。尽管我采取的这种方法可能有些过分,但我计划长期支持该应用程序,并计划将其移植到Android平板电脑、iPad和Windows8框架,因此我有必要花额外的时间来实现这一点

我尝试了MVP模式,但在这种情况下,它不够灵活,无法工作。我也尝试过各种框架,但最终我定制了整个框架,因为它给了我最大的灵活性。无论如何,它都不是微不足道的,如果您对抽象、泛型和面向对象设计没有非常透彻的理解,那么我建议您使用一种更简单的方法,否则您将在尝试实现它时付出惨重的代价

如前所述,Android有很多细节,例如,我在Android中遇到的最大问题是多线程或异步操作和活动旋转,这将完全破坏你的活动并重新创建它,从而抹杀你的视野。我自己选择了管理所有轮换配置的路径,这意味着我必须清理所有可提取的内容和使用的资源