MVP中Model的進(jìn)一步細(xì)化——DataManager

前言

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

依賴注入圖

gtihubquery依賴注入圖1.png

githubquery依賴注入圖2.png

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

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

@Inject()

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

項(xiàng)目架構(gòu)圖

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

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

在這里DataManager就是整個(gè)架構(gòu)的核心了。因?yàn)槲覀兪褂玫氖莚xjava+retrofit,自然要有一種流的思想。你可以這樣想,一個(gè)數(shù)據(jù)流從hepler類流到datamanager,然后在這里做你所需要的變換。比如你需要把所有學(xué)生姓名的首字母大寫,但是api返回的元數(shù)據(jù)是沒有大寫的。這樣做其實(shí)就是為了給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;
    }

    //對(duì)用戶信息進(jìn)行一層過濾或者操作,然后在presenter中去調(diào)用這個(gè)方法.
    //當(dāng)然我在這里做的操作毫無意義,但是如果有需要還是會(huì)減少activity活著fragment中的代碼量。
    //presenter只負(fù)責(zé)調(diào)用。然后獲得數(shù)據(jù)而不管代碼的實(shí)現(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);
                            }
                        });
                    }
                });

    }

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

}

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

不足

沒有任何東西是完美的。

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容