MVP中Model的進一步細化——DataManager

前言

首先上篇文章講到的是依賴注入(dagger),然后我使用rxjava, retrofit, dagger2, mvp做了一個練手app——githubQuery,算是第一次嘗試吧。再是mvp用的是我自己的一個框架EasyMVP。然后在model層我學(xué)習(xí)了一個老外的想法,抽出來了一個叫datamanager的東西,它屬于model層,用于過濾和操作從model層得到的數(shù)據(jù)。主要的目的是方便dagger提供單一的數(shù)據(jù)層依賴,并且減少presenter層的代碼量。這幾個庫都不好上手,但是我覺得多用多寫就好了,我現(xiàn)在已經(jīng)在用這套方法在做別的項目了。

依賴注入圖

gtihubquery依賴注入圖1.png

githubquery依賴注入圖2.png

可以看到我在ActivityComponent中的API是拋出了很多的inject方法用來注入其他所有的activity,但是這種做法適合小項目,項目大了之后,如果每個activity的依賴需求不同還是很麻煩,所以最好一個activity一個component。對照這個圖看代碼基本問題不大,我記得當(dāng)時對于@Inject這個注解的理解不是很深刻!

DataManager相當(dāng)于是model所有數(shù)據(jù)源的代理層,作為ApplicaitonComponent的API暴露出來,然后作為ActivityComponent的依賴注入進去。

@Inject()

如果@Inject標(biāo)注的是構(gòu)造方法。那么表明這個類的對象也是依賴注入圖里面的一員,前提是這個構(gòu)造函數(shù)里面的所有參數(shù)都是來自依賴注入圖(@provide)。

項目架構(gòu)圖

githubquery項目架構(gòu)圖.png

注意,我的mvp開發(fā)模式是將activity,fragment作為presenter。

在這里DataManager就是整個架構(gòu)的核心了。因為我們使用的是rxjava+retrofit,自然要有一種流的思想。你可以這樣想,一個數(shù)據(jù)流從hepler類流到datamanager,然后在這里做你所需要的變換。比如你需要把所有學(xué)生姓名的首字母大寫,但是api返回的元數(shù)據(jù)是沒有大寫的。這樣做其實就是為了給activity等presenter瘦身。我貼出我的DataManager的代碼:

/**
 * Created by Zane on 16/1/26.
 */
@Singleton
public class DataManager {

    private GithubApiService githubApiService;
    private Context mContext;

    @Inject
    public DataManager(@ContextType("MyApplication")Context context, GithubApiService githubApiService){
        this.githubApiService = githubApiService;
        mContext = context;
    }

    //對用戶信息進行一層過濾或者操作,然后在presenter中去調(diào)用這個方法.
    //當(dāng)然我在這里做的操作毫無意義,但是如果有需要還是會減少activity活著fragment中的代碼量。
    //presenter只負責(zé)調(diào)用。然后獲得數(shù)據(jù)而不管代碼的實現(xiàn)
    public Observable<Users> getUserInfo(String userName){

        return githubApiService.getUserInfo(userName)
                .map(new Func1<Users, Users>() {
                    @Override
                    public Users call(Users users) {
                        String name = users.getName();
                        users.setName(name + " datamanager");
                        return users;
                    }
                })
                .flatMap(new Func1<Users, Observable<Users>>() {
                    @Override
                    public Observable<Users> call(final Users users) {
                        return Observable.create(new Observable.OnSubscribe<Users>() {
                            @Override
                            public void call(Subscriber<? super Users> subscriber) {
                                subscriber.onNext(users);
                            }
                        });
                    }
                });

    }

    //對庫的信息進行一層過濾
    public Observable<List<Repos>> getReposInfo(String userName){
        return githubApiService.getReposInfo(userName);
    }

}

我將用戶的名字后面加了一個datamanager,在這里雖然沒什么意義,但是要體現(xiàn)datamanager的作用所在。

不足

沒有任何東西是完美的。

這里如果只有一個DataManager的話,那么如果數(shù)據(jù)量一大,這個類會變得非常的臃腫和復(fù)雜。

所有東西都是在不斷嘗試吧,貼出這個思想創(chuàng)始人的文章:Android Application Architecture

好了,去上課了。。近代史!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容