【问题标题】:Reusing Monotouch code in Monodroid app在 Monodroid 应用程序中重用 Monotouch 代码
【发布时间】:2010-09-08 18:40:20
【问题描述】:

我目前正在实现一个最终将被移植到 Monodroid 的 Monotouch 应用程序。该应用程序只是 OData Web 服务的客户端。没有什么太花哨或性能关键。

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

由于我的 UI 层遵循 MVP 模式,我也希望通过编码每个视图的抽象表示来重用 UI 控制器。但是,我只能猜测这是否可行,因为我还没有被允许使用 Monodroid 测试版。

现在我的问题:

  • 您如何看待这种方法?这是一个好主意,还是会因为 iPhone 和 Android 的 UI 概念不同而导致应用程序平庸?

  • 您能否提供有关如何构建应用程序以最大限度地重复使用代码的提示?

谢谢,

阿德里安

【问题讨论】:

  • 我希望您看看您是如何使用 MVP 模式构建应用的
  • @mgroves:我制作了一些图表并实现了其中的一部分,但最终它都没有实际意义。正如 Chris 正确观察到的那样,在 Monotouch 和 Monodroid 上,很难将 MVP 模式与通用模型和控制器部分一起使用,因为用户界面范例是如此不同。请注意,这并不意味着 MVP 根本不适用于手机开发,它在使用 Mirabyte 的触摸控制套件为 windows Mobile (bit.ly/fnln84) 实现应用程序时非常有用,因为所有屏幕都通过单个触摸列表显示在那个应用程序中。

标签: architecture mvp xamarin.ios xamarin.android


【解决方案1】:

您如何看待这种方法?这是个好主意,还是会因为 iPhone 和 Android 的 UI 概念不同而导致应用程序平庸?

我会说后者,但您绝对可以重用大部分业务和域对象。 Monodroid 中使用了相同的 Mono Sqlite,因此您的应用程序的数据持久化部分(如果它使用的话)是可重用的。

我不会费心创建中间层 UI - 两者完全不同。例如,在 Android 应用程序上,您有底部菜单,屏幕上可以包含 6 个按钮。在 iPhone 上,标签栏或工具栏中很可能没有 6 个按钮。为此制定一个通用模式对您没有多大帮助。

另一个例子是 ListViews (UITableViews)。他们完全不同。正如您所期望的那样,Monodroid 实现忠实于它丑陋的 Java 姐妹。在 Android 上,您不必使用 Apple 强加给您的巨大的间接纠缠,而只需一个简单的 ArrayAdapter 作为数据源 - 为更复杂的布局进行子类化。

另一个需要注意的重要事项是Android 没有一个屏幕尺寸。您为3 different screen densities 创建图像。字体大小不是绝对的。

Android 为您提供了类似于 XAML 和 Web 的布局机制,但在 iPhone 上您并不那么幸运(或者更幸运,取决于您如何看待它),因为一切通常都是绝对定位的(他们可以像往常一样做到这一点320x480)。

您能否提供有关如何构建应用程序以最大限度地重复使用代码的任何提示?

我认为您已经为数据覆盖了大部分单独的层并坚持使用控制器。如果没有看到您的应用,很难说重用控制器(无论您使用 UITableViews 还是自定义 uis)有多容易,但 Android 的开发速度要快得多,我认为这应该是一项快速的任务。

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

【讨论】:

    【解决方案2】:

    听起来你有一个非常可靠的概念。事实上,有一个名为 MonoCross 的开源项目 (http://code.google.com/p/monocross/) 使用 MVC 模式来做类似的事情。

    Miguel de Icaza 分叉了一个看起来很酷的 MVVM 项目,它也可能对您有所帮助。 https://github.com/migueldeicaza/MonoTouch.MVVM

    【讨论】:

    • 看起来很有趣 - 非常感谢您的链接!
    【解决方案3】:

    我已经成功地为我的表示层实现了 MVC 模式,领域模型、服务层、存储库和通用都与平台无关。我确实需要有平台特定的代码,例如 NetworkConnectionManager(我的名字)项目作为 Android、iPhone 和 Windows Phone 项目,除了我省略了 UI 层,它是所有用户界面平台特定的 crud。我还用 CONSOLE 定义标记我的控制台,用 ANDROID 定义我的 Android 项目,以便我可以执行 #if #endif

    我不得不说它工作得很好,如果我可以在控制台中对我的整个 MVC 层进行单元测试并让它在 Android 下工作,那么我几乎可以保证它会在 iPhone 和 Windows Phone 下工作,因为控制台没有甚至有一个界面。这是测试我的表示层通用性的完美方法。尽管我采用的这种方法可能有点矫枉过正,但我​​计划长期支持该应用程序,并且我还计划将其移植到 Android 平板电脑、iPad 和 Windows 8 框架,因此 IMO 有必要花额外的时间来解决这个问题.

    我尝试了 MVP 模式,但在这种情况下它不够灵活,无法正常工作。我也尝试了各种框架,但我最终定制了整个框架,因为它给了我最大的灵活性。这无论如何都不是微不足道的,如果您对抽象、泛型和面向对象设计没有非常透彻的了解,那么我建议的方法比我建议的更简单,否则您将努力使您的生活陷入困境。

    如前所述,Android 有很多来龙去脉,例如我在 Android 上遇到的最大问题是多线程或异步操作和 Activity 轮换,这将彻底破坏您的 Activity 并重新创建它与它一起消除您的视图。我选择了自己管理所有旋转配置的路径,这意味着我必须手动清理所有可绘制对象和活动使用的资源。

    【讨论】:

    • 这似乎是我最初想要的方法。感谢您分享所有这些信息,我将再看看这种方法。
    • 我遇到的最大问题是如何将 iOS NavigationControllers 集成到此模式中。您是如何解决这一挑战的?
    • 我不使用控制器作为视图,而是创建另一个类来继承控制器引用的视图并从那里调用它,它有点像代理视图如果有意义的话,间接代表视图。
    【解决方案4】:

    我尝试做类似的事情 - 就我而言,因为我想使用 VS 和我所有的 Windows 开发工具来编写尽可能多的代码。

    但是,我恢复为仅将模型层设为“通用” - 并在 Mac 上(即在 MonoDevelop 中)执行 UI 层(控制器和视图)。对于我正在开发的相对较小的应用程序而言,所涉及的工作量太大了——而且只有我一个人在开发它。

    此外,如果您是 iPhone 和/或 Android 的新手,尝试做一些相对复杂的事情会使您更难找到示例或获得问题的答案。我发现我让自己的生活变得更加艰难(当然在我使用 iPhone 的早期阶段)。

    当然,如果不了解您的项目和商业模式的来龙去脉,很难给出任何具体的建议,但这些都是我的经验 - 值得。

    【讨论】:

    • 听听你的经历肯定会有所帮助。感谢您的回复!
    【解决方案5】:

    可能有点晚了,但是这个cross-platform mobile development 视频很有帮助。我还在编写一个将移植到 Android 和 WP 的 MT 应用程序。对于数据存储,我正在认真考虑Vici CoolStorage,它应该是数据模型completely re-usable。此外,我正在将任何与平台无关的代码移动到解决方案中的实用程序和通用项目。我也希望能够在 MD 和 WP 中重用 web 服务通信代码。其余的目前是特定于 iOS 的。

    了解您的项目进展情况会非常有趣。代码可重用性真的有回报吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多