Re: S2DomainModel リリース

Ouobpoさんが S2DomainModel というプロダクトを公開された。
http://ameblo.jp/ouobpo/entry-10095107002.html

ドメインオブジェクトに対して、Factory や Repository のメソッドを通過するときに、必要なコンポーネントを DI してくれるというもの。
個人的には、実装方法としての DomainModel にはあまり執着していないんだけど、発想は面白いなと思った。
意見を聞かれたので口頭で伝えたけれど、ここにもまとめておく。

アノテーションの必要性

Ouobpoさんの実装だと、Factory や Repository にアノテーションをつけることで、ドメインオブジェクトへの DI を実現している。
でも、直接 new するのではなく、Factory や Repository を使うなら、アノテーションじゃなくて、Factory や Repository の実装クラスで DI するコードを呼び出しても一緒じゃないかなと思った。
具体的には、↓こんなインタフェースを用意しておいて、

public interface ModelHelper {
    void injectDependency(Object model);
}

Repository なら、↓こんな感じで実装しても良いのではと思う。

public class PersonRepositoryImpl implements PersonRepository {

    PersonDao personDao;

    ModelHelper modelHelper;

    public Person getPerson(final String name) {
        final Person person = personDao.getByName(name);
        // DAOにModelFactoryを組み込んだ方がベター。
        modelHelper.injectDependency(person);
        return person;
    }
}

アスペクトの適用

上の方法だと、ドメインオブジェクトへアスペクトの適用ができない。
そこで、↓こんなAPIを用意しておいて、

public interface ModelFactory {
    <T> T create(Class<T> clazz, Object... args);
}

ドメインオブジェクトの Factory や DAO で、オブジェクトを生成する際に、DI したらどうでしょう?
ざっと実装もしてみました。
http://svn.sourceforge.jp/svnroot/glad/trunk/seasar2-x/src/main/java/jp/sourceforge/glad/org/seasar/framework/model/
使い方は↓このあたりを見てください。
http://svn.sourceforge.jp/svnroot/glad/trunk/seasar2-x/src/test/java/jp/sourceforge/glad/org/seasar/framework/model/impl/
http://svn.sourceforge.jp/svnroot/glad/trunk/seasar2-x/src/test/resources/jp/sourceforge/glad/org/seasar/framework/model/impl/

ちなみに、ドメインオブジェクトは DIコンテナに登録しなくても良いようにしましたが、SMART deploy を考慮すると登録したほうがいいのかな?

その他の問題

あとから思いついたのですが、実際に使おうとするとまだまだ問題があると思います。

  • Serialize/Desirialize の際、注入されたコンポーネントの扱いをどうするか?
  • ドメインオブジェクトはレイヤーをまたいで使用されるか? またいで使用される場合、注入されたコンポーネントの扱いをどうするか?