ModelBinder実装 part1(方針)

Android向けのデータバインド(モデルバインダ)だが、新規のコードは出来るだけ書かずに、今まで.NET C#/WindowsForms、Java /Swingで書いてきたコードを最大限に再利用したい。あまり時間が無いのだ。

    • バリデーション全般

GUI側のバリデーション関連のクラスと、XMLで書いたバリデーションメタデータシリアライズするクラスは全てそのまま取り込んで、ここにJSR 303(Beans Validation)の仕様を追加する。

    • DxOコンバータ全般

GUIDTOの間のデータ交換を実現するDxOと、その内部実装で必要となるコンバータ群は全て取り込む。
DxOのコンバータはモデルバインダの実装ではコアに使われるクラスになると思われる。

    • 例外クラス全般

上記クラスを実装する際に発生した全てのランタイム例外は再利用する。

    • DI関係のクラスの一部

Seasar2及びSesar2.NET Frameworkのコアクラスのうち、

      • AutoRegister関連
      • BeanDesc/PropertyDesc関連

これらの一部をAndroid向けに改造して利用させて頂く。
前者はデータバインド対象のアクションクラスのディスカバリとインスタンスの自動作成に、後者はプロパティの実装を持たないJava、JavaBeans仕様に準拠していないAndroidにおいてリフレクション情報とプロパティ情報を一元的に管理する用途に使用する。

この二つとDxOコンバータはここ数年、私が書いた全てのフレームワークに組み込まれており、非常に再利用率が高い。

    • ユーティリティ全般

文字列、ファイル、ストリーム、リフレクションなどの汎用的なユーティリティは再利用する。


これら再利用したクラスライブラリィをベースにデータバインドの機能を書いていく訳だが、まずは何はなくともインタフェースだ。モデルバインダで使用するインタフェースを決めておこう。

public interface IModelBinder {
    public Object bind(BindingContext bindingContext, ActivityContext activityContext) throws Exception;
}

意味としてはASP.NET MVCのIModelBinder..BindModelと殆ど同じ。

BindingContextは同ModelBindingContextと同じく、対象となるメソッドパラメタの実引数をバインドするためのコンテキストであり、ActivityContextはASP.NET MVCのControllerContextと同様に、バインドの対象となるビュー側のコンテキストを抽象化する。

BindingContextはPOJO(PONO)のパラメタの型や属性を保持するので、ASP.NET MVCと変わらないが、ActivityContextは相手がActivity及びそれに内包されているViewであり、HTTPRequestのように引数が"パラメタ1=値, パラメタ2=値"と並んでいる訳では無いため、

    • Viewのプロパティを特定するなんらかの仕組み
    • 特定されたプロパティとパラメタをマップする仕組み

これらが必要になる。


以上は携帯電話のアプリケーションではリッチすぎるのかもしれないが、Androidの場合は携帯電話のプラットホームに限定して考えることはナンセンスであり、むしろ「センサも制限も多い小さいPC」と考えるべきなので、あまり気にしないことにしている。

気にすべきは、何時切断するかもしれないネットワークや、何時停止されるかもしれないアプリケーションの特性だろう。