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 を考慮すると登録したほうがいいのかな?