2016-12-29 15 views
1

私はMVPアーキテクチャーパターンでアンドロイドプロジェクトをコーディングする必要がある学校プロジェクトに取り組んでいます。私はGoogle Dagger 2についても少しの研究を始めました。今のところ私は単にユーザーがデータベースに存在するかどうかをチェックしようとしています。誰もが知っているように、問題は文脈を渡すことです。私は簡潔な答えを探しましたが、何も見つかりませんでした。これが私のやり方です。コンテキストにダガー2を使用するためのAndroid MVP + Google Dagger 2 + SQLite

コード:

public class DaggerApplication extends Application { 
    DaggerComponent daggerComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     daggerComponent = DaggerComponent.builder().daggerModule(new DaggerModule(this)).build(); 
     daggerComponent.inject(this); 
    } 

    public DaggerComponent getAppComponent(){ 
     return daggerComponent; 
    } 
} 


@Module 
public class DaggerModule { 
    private final DaggerApplication daggerApplication; 

    public DaggerModule(DaggerApplication daggerApplication){ 
     this.daggerApplication = daggerApplication; 
    } 

    @Provides 
    @Singleton 
    Context providesApplicationContext() { 
     return this.daggerApplication; 
    } 

    @Provides 
    @Singleton 
    SharedPreferences providesSharedPreferences(Context context) { 
     return context.getSharedPreferences("My_Pref", Context.MODE_PRIVATE); 
    } 
} 

@Singleton 
@Component 
     (modules = {DaggerModule.class}) 
public interface DaggerComponent { 
    void inject(DaggerApplication daggerApplication); 
    void inject(SigninActivityFragment signinActivityFragment); 
} 

私は、このようなフラグメントに私のコンテキストを取得:

@Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ((DaggerApplication)getActivity().getApplication()).getAppComponent().inject(this); 
     accountPresenter = new AccountPresenter(this,new MyDatabaseSource(context)); 
    } 

MyDatabaseSourceが動作するデータベースに対して、このコンテキストを必要とします。次に、このMyDatabaseSourceがデータベースを開き、データベースからユーザーを取得して閉じます。このようなもの:

public class MyDatabaseSource implements MyModel { 
    public MyDatabaseSource(@NonNull Context context) { 
     checkNotNull(context); 
     myLocalDatabaseOpenHelper = new MyLocalDatabaseOpenHelper(context); 
    } 
    //Implementing MyModel functions here 
} 

これは私にコンテキストが必要な理由です。

MyDatabaseSourceが実装するインターフェイスを作成し、MyModelという名前を付けました。ここで

はコードです:

public interface MyModel { 

    void insertUser(User user); 
    void deleteUser(int index); 
    void updateUser(User user); 
    ArrayList <User> getUsers(); 
    User getUser(int index); 

} 

その後、私のプレゼンターは、それが中に次の私のビューとモデルの間の中間の男になるために必要なすべてを持っています。

これは私のプレゼンターコードです:

public AccountPresenter(AccountView accountView, MyModel myModel) { 
     this.accountView = accountView; 
     this.myModel = myModel; 
    } 

    public void onSignInButtonClicked() { 
     String username = accountView.getUsername(); 
     String password = accountView.getPassword(); 
     if (username.isEmpty()) { 
      accountView.setUsernameErrorMessage(R.string.activity_signin_username_error); 
     } 
     if (password.isEmpty()) { 
      accountView.setPasswordErrorMessage(R.string.activity_signin_password_error); 
     } 

     ArrayList<User> userArrayList = myModel.getUsers(); 
     if (userArrayList.size() != 0) { 
      for (int i = 0; i < userArrayList.size(); i++) { 
       if (username.equals(userArrayList.get(i).getUserName())) { 
        if (password.equals(userArrayList.get(i).getUserPassword())) { 
         accountView.showUserExists(R.string.activity_signin_user_exists_toast); 
        } else { 
         accountView.showIncorrectPassword(R.string.activity_signin_incorrect_password_toast); 
        } 
       } else { 
        accountView.showUserDoesNotExist(R.string.activity_signin_user_does_not_exist_toast); 
       } 
      } 
     } else { 
      accountView.showNoUserExists(R.string.activity_signin_no_exists_toast); 
     } 
    } 

私は、これはGoogleのダガー2を使用してMVPを実装するための正しい方法であれば、これを実現するための別の方法があるはずのように、私は個人的に感じて知っていただきたいと思います。プレゼンターにコンテキストを渡すことは、Google Daggerを使用する目的よりも優れています。私はちょうどGoogle Dagger 2とMVPのパターンについて研究を始めました。だから、どんな提案も役に立ちます。私はちょうどそれが正しいと思う。グレードを失いたくない。 :)

ご意見やアドバイスをお寄せください。 :)プレゼンターにコンテキストを渡す

+0

この記事は役に立つと思われる[AndroidでのアクティビティがUI要素でない理由](http://www.techyourchance.com/activities-android/) – tchelidze

答えて

1

は、Androidアプリは(main(String [] args)法のような)単一のエントリポイントを持っていた場合、すべてを注入することが可能と望ましいであろうGoogleのダガーに

を使用する目的を打ちますコンテキストを含む依存関係は、Daggerだけを使用しています。言い換えれば、DaggerコンポーネントがContextをパラメータとして初期化されるこのシステムを持つ必要はありません。この場合、プレゼンターにコンテキストを渡すと、Dagger 2を使用する目的が何らかの形で損なわれます。

ただし、アプリケーションを構成するアプリケーションとアクティビティのインスタンスは直接インスタンス化できません。これらのクラスの一部はパブリックコンストラクタを持つことがありますが、インスタンス化によって完全に機能するインスタンスを取得することはできません。代わりに、インスタンス化されたこれらのクラスには、システムによってContextおよびその他の依存関係(FragmentManagerなど)が提供されます。

同様に、アプリケーションまたはアクティビティからのコンテキストをリポジトリ/データまたはモデルの依存として持つことは、モデルとビューの間の懸念の予防可能な違反の分離ではありません。

私は、これは私はあなたが他のサンプルMVPプロ​​ジェクトをやっていることを比較する必要があります考えてGoogleのダガーこのため2

を使用してMVPを実装するための正しい方法であるかどうかを知りたいです。ここではあなたが本当にMVPの3つの顕著な特徴を満たしている場合は、あなたが決定する必要があります、またofficial one from Google

です:

モデルはデータを定義するインタフェースが表示されるか、そうでなければ作用される
    1. ユーザーインターフェイスに表示されます。
    2. プレゼンターはモデルとビューを操作します。リポジトリ(モデル)からデータを取得し、ビューに表示するためにフォーマットします。
    3. このビューは、データ(モデル)を表示し、ユーザーコマンド(イベント)をプレゼンターにルーティングしてそのデータを処理するパッシブインターフェイスです。むしろあなたは、AndroidでMVPのための「正解」を持っているかどうかを心配するよりも

    、私は、あなた自身が理解することができ、アプリがMVPの基準を満たす方法を正当化するために最も重要なことだと思いますAndroidアーキテクチャの制約の中で懸念の分離を実現します。

  • 関連する問題