1. 程式人生 > >MVP+Dagger2+Retrofit實現更清晰的架構

MVP+Dagger2+Retrofit實現更清晰的架構

這個架構已經有不少文章介紹了,今天打算自己實踐下。

MVP概念不多說了 相關介紹已經很多了

Dagger2:依賴注入框架,用來解決依賴 除了基本依賴 mvp的V–>P–>M的之間依賴也輕鬆解決 方便不少

Retrofit:用來解決M的RestApi資料獲取, 天然支援Rxjava 不過這裡我沒用到Rxjava 其自帶的Callback已經足夠用了

估計這個架構的難點在於Dagger2 理解它的工作方式需要方式需要點時間,我收集了一些資料,可以檢視我部落格的相關文章。

ok,開始寫demo,簡單看下專案結構

專案結構

  • data:資料來源 也就是MVP的M
  • model:實體bean,本來也應該放在data中,為了方便查詢就抽出了,畢竟很多地方用到
  • ui:檢視,V和P都在裡面,View層是最難組織的,有人喜歡以功能劃分 eg:main,login 有人喜歡以元件劃分

完整專案結構

來簡單看一下dagger2提供的依賴結構

dagger依賴結構

AppComponent通常提供全域性的物件以便於其他的元件依賴使用,比如context,rest api介面等,這些都是全域性的單例物件

MainActivityComponent特意針對MainActivity,所以它只提供其對應的MainActivityPresenter,因為其依賴AppComponent,所以它可以使用AppComponent提供的物件

AppComponent
可以看到其向外公佈了Application,ApiService,User三個物件,供其他component都可以使用

@Singleton
@Component(modules = {AppModule.class, ApiServiceModule.class, AppServiceModule.class})
public interface AppComponent {


    Application getApplication();

    ApiService getService();

    User getUser();
}

MainActivityComponent
它依賴了AppComponent,本身只提供了MainActivityPrresenter,並且只針對MainActivity

@ActivityScope
@Component(modules = MainActivityModule.class,dependencies = AppComponent.class)
public interface MainActivityComponent {
    MainActivity inject(MainActivity mainActivity);

    MainActivityPresenter presenter();


}

最後看一下Activity怎麼使用

public class MainActivity extends BaseActivity {

    @InjectView(R.id.tv)
    TextView textView;

    @Inject
    MainActivityPresenter presenter;//注入其所需要的presenter


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        presenter.showUserName();

    }

    @Override
    protected void setupActivityComponent(AppComponent appComponent) {
        DaggerMainActivityComponent.builder()
                .appComponent(appComponent)
                .mainActivityModule(new MainActivityModule(this))
                .build()
                .inject(this);

    }

//只做介面邏輯
    public void setTextView(String username){
        textView.setText(username);
    }




}

程式碼就不全貼了 後面會放到github上面去
顯而易見,整個專案和結構會非常舒服,各個模組各司其事,有了dagger在擴充套件和測試會非常方便,分別提供DebugComponent和ReleaseComponent隨意切換

附上github地址:點我哦