【问题标题】:Android CleanArchitecture Domain module and AutoValueAndroid CleanArchitecture Domain 模块和 AutoValue
【发布时间】:2017-01-24 12:03:45
【问题描述】:

我想在一个新的应用程序中使用干净的架构,到目前为止它工作得很好。我将应用程序分为 3 个模块(演示、数据和域),如下例所示:Android-CleanArchitecture

我的域模块中有一些实体。其中之一是用户。

    public class User {

        private String name;

        public String name () {
            return name;
        }

        public static class Builder {
            ...
        }
    }

我想使用带有一些扩展的 AutoValue 来摆脱样板代码。扩展名之一是AutoValue Parcel。现在我需要实现 android.os.Parceable 接口,它是 android 的一部分,不能在我的域模块中使用,因为它是一个 Android 依赖项。

实现这个的正确方法是什么?

【问题讨论】:

  • 我也有同样的问题,可能我们应该使用java.io.Serializable,但我更喜欢使用类似于github.com/rharter/auto-value-parcel的一些库。
  • 是的,但我认为最终将域模块设为 android 库会更好。
  • AFAIK,Domain Layer 不应该有任何 Android 依赖,否则测试会很困难。
  • 是的,我知道。这就是我问这个问题的原因

标签: android auto-value clean-architecture


【解决方案1】:

在 Android 中实现清晰架构的理想有点困难,因为 Android 是一个完整的框架,有自己的规范,即使在基本语言级别也是如此。

我认为,由于特定工具免费级别的理想主要用于测试目的,因此 - 这应该是处理 Android 时的主要目标。

关于Parcelable 本身,认为它只是为模型对象添加了额外的方法,以使Android OS 能够在不同系统组件之间序列化/反序列化数据。因此,由于您在域级别的测试不是由 Android 操作系统运行的,因此它们不应触及此方法,并且不会影响您的测试。

考虑一下,Android 中其他几个在单元测试中不可用的 API,例如 Uri、DateUtils、SparseArray 等等...
这就是我认为 Roboelectric 可以派上用场的地方,它可以模拟这些 Android 原语。

说了这么多...有了清晰的架构,您的领域级别应该与表示级别分开,所以基本上您将在 both 层(可以共享接口)和两者中都有模型对象他们可以使用AutoValue,但是,只有在演示级别,您才能实现Parcelable 接口(这是需要它的接口,因为在这个级别您将与系统交互并使用Parcel)。 域级别中没有 Android 依赖项并不是这种分离的唯一考虑因素,请记住,表示级别可能会添加与域级别无关的信息。

【讨论】:

  • 感谢您的澄清。所以我需要将我的域模块(纯Java)中的实体映射到我的演示模块(Android)中的实体。我假设演示模块对此负责。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2017-10-18
  • 1970-01-01
相关资源
最近更新 更多