在Clean Architecture中管理领域实例的最佳实践是什么?

时间:2016-06-29 02:53:54

标签: android realm

我的项目使用干净的架构。在这种情况下,UI层与Domain层分开。所以我认为UI层没有自己的领域实例会更好。正如领域的文档建议在Activity的生命周期中管理领域实例,那么我该如何处理领域实例呢?

更清楚一点,我的项目太重了,无法更改所有对象extends RealmObject。所以我使用单独的对象来持久化数据。当api调用完成时,业务对象转换为领域对象,与来自领域的查询相反。我创建了这样的方法:

public void insert(T object){
    final Realm realm = RealmProvider.getRealm();
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.copyToRealmOrUpdate(createRealmObject(object));
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            realm.close();
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            realm.close();
        }
    });
}

实际上,它运作正常。但是下面我不知道如何处理关闭领域实例。

public Observable<T> queryAsync(Condition<? extends RealmObject> condition) {
    final Realm realm = RealmProvider.getRealm();
    return condition.getQuery(realm).findFirstAsync()
            .asObservable()
            .filter(new Func1<RealmObject, Boolean>() {
                @Override
                public Boolean call(RealmObject realmObject) {
                    return realmObject.isLoaded();
                }
            })
            .map(new Func1<RealmObject, T>() {
                @Override
                public T call(RealmObject realmObject) {
                    return createObjectFromRealm(realmObject);
                }
            });
}

2 个答案:

答案 0 :(得分:3)

如果要在代码中的UI和数据库层之间进行清晰的分离,并且想要抽象出数据库逻辑,以便理想情况下您的活动可以调用数据库层而不知道该层是如何实现的,那么Realm可能不是什么你正在寻找。

Realm对象绑定到realm实例,这意味着如果从realm实例中检索对象然后关闭该实例(必须这样做),则无法再使用该对象。这违背了使用Realm的全部目的。

如果您打算使用Realm,您应该将领域逻辑与您的活动/服务等紧密相关,并且不要试图将其隐藏在单独的层中,以便您可以完全控制它。

        .map(new Func1<RealmObject, T>() {
            @Override
            public T call(RealmObject realmObject) {
                Object o = createObjectFromRealm(realmObject);
                realm.close();
                return o;
            }
        });

答案 1 :(得分:0)

干净架构的一个主要方面是主要库(即Realm)的隔离。由于Realm,RealmObject,RealmResults不能在它们创建的Thread之外访问,因此保持Realm&amp;更重要。与其余代码隔离的领域相关计算。

您在queryAsync()方法中使用RxJava,同时使用executeTransactionAsync()方法,这违反了使用RxJava的全部目的。你可以这样做,

public void insert(T object){
    final Realm realm = RealmProvider.getRealm();
    realm.executeTransaction(realm1 -> 
    realm1.copyToRealmOrUpdate(createRealmObject(object)));
    realm.close();
}

在一个良好的架构中,对于每个jsonModel类,应该有一个相应的realmModel类&amp; DAO(数据访问对象)。 DAO类必须将jsonModel作为参数,并且必须返回jsonModel作为结果。必须在DAO文件中限制所有与Realm相关的操作,这样DAO和realmModel以外的任何代码都不会知道Realm。

这是一篇关于Realm最佳实践的文章,其中有一个很好的架构https://medium.com/@Viraj.Tank/realm-integration-in-android-best-practices-449919d25f2f

此外,一个示例项目演示了Android上的Realm与MVP(模型视图演示者),RxJava,Retrofit,Dagger,Annotations&amp;测试。 https://github.com/viraj49/Realm_android-injection-rx-test