在干净体系结构中管理领域实例的最佳实践是什么?



使用干净体系结构我的项目。在这种情况下,UI层与域层分开。因此,我认为UI层没有拥有领域实例会更好。正如领域的文档建议管理活动生命周期中的领域实例一样,我应该如何处理领域实例?

更清楚,我的项目太重了,无法更改所有对象延伸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);
                }
            });
}

如果您需要在代码中的UI和数据库层之间进行干净的分离,并且要抽象数据库逻辑,以便理想情况下,您的活动可以在不知道该层的情况下调用数据库层实施,然后领域可能不是您要寻找的。

REALM对象与Realm实例相关联,这意味着,如果您从领域实例检索对象,然后关闭该实例(您必须),则无法再使用该对象。打败了使用领域的全部目的。

如果您要使用领域,则应将领域逻辑密切与您的活动/服务等紧密相关,并且不要试图将其隐藏在单独的一层中,以便您对其进行完全控制。bk_hr>

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

干净体系结构的主要方面之一是,主要库的隔离(即领域)。由于领域(RealMobject),因此无法在其创建的线程之外访问领域,因此保持领域&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文件中受到限制,因此,除了DAO和Realmmodel以外,没有其他代码知道领域。

这是一篇有关领域最佳实践的文章,具有良好的架构

也是一个示例项目,证明了与MVP(模型视图主持人),RXJAVA,RETROFIT,RETROFIT,DAGGER,ANNOTATIONS&amp; amp;的样本项目。测试。https://github.com/viraj49/realm_android-injection-rx-test

相关内容

最新更新