[Seasar-user:11252] Re: 【 DBFlute 】 Behavior と DAO の関係について

kubo [E-MAIL ADDRESS DELETED]
2007年 10月 24日 (水) 14:38:58 JST


久保です。

> >先述の通りSeasar2を全く使わずにS2Daoが動作することは無いのですが、
> >要は「内部ではSeasar2を使っているけどプログラマは意識する必要がない」
> >ということであれば、やりたいことが満たせるのではないかと思います。
> 
>  でほぼ合っています。
>  そして、立場的には自分が「もう一踏ん張り」するべき立場です。
> (なので、本来はSeasar2の全体像をもっとしっかり把握すべきですし、
>  これは避けるべきではないですよね)

そうですね。
もう一踏ん張りが大事なところだと思います。
頑張った分、プログラマが業務仕様に集中できますので。

> >Seasar(S2Container)、ということになると思います。
> >BehaviorにDAOのsetterが用意されているのは
> >基本的にはインジェクション(DIコンテナが自動的にインスタンスをセットする)
> >するためです。
> >(テストなどで何か臨時のDao実装クラスを作ってセットすることはあるかもしれませんが)
> 
>  おそらく上記に回答内容は集約されているのだと思いますが、
>  この場合はつまり、
> 
>  S2コンテナからBehaviorを取得するタイミングで、
>  BehaviorにDAOがインジェクションされるという理解で合っていますでしょうか?
>  (つまりS2コンテナからDAOを直接取得はしない)

ほぼ合っています。

「S2コンテナからBehaviorを取得するタイミングで」
    ↓
「S2コンテナが、Behaviorを生成するタイミングで」

というのが正確なところです。
Behaviorを取得するときは、
「既にDaoがインジェクションされたBehavior」を取得することになります。

「S2コンテナからDAOを直接取得はしない」は合っています。
(ここはどちらにせよ変わりはありません)


>  プログラマの方に説明無しでとりあえずサンプルを作ってもらったところ、
>  明示的にDAO実装クラスをセットする実装だったので、おかしいと思い、
>  質問をしたというのが直接の流れです。(上記の通りBehavior取得タイミング
>  でのインジェクションだと思っていた)

なるほど。

ContainerからBehaviorを取得した時点で、Daoは存在していますので、
明示的にDAO実装クラスをセットする必要はありません。

> >DBFluteに「BFinder」というクラスがいます。
> >これを使うと、DIコンテナの存在を意識せずに
> >「Behavior/Daoの生成・設定」と「Behaviorの取得」ができます。
> 
>  こちらのクラスを今回のような目的で使うのは、想定範囲内でしょうか?
>  正しい使い方であれば飛びつきたいところなのですが、
>  通常は「コンテナ経由で明示的に取得」であれば、そちらで行おうと
>  考えています。(あまり隠蔽しすぎると、別のところでつまづいた
>  時に困りそうなので)

今回のような目的「のみ」で使うことを想定しています(^^
通常は、Behaviorを使おうとしているComponentにインジェクションして
利用するのが普通なのですが、佐藤さんのようなニーズを想定して、
作成されました。

「BFinder」は、以下のような動きをします。

if (Seasarが初期化されていなければ) {
    Seasarを初期化("dbflute.dicon");
}
return SeasarからBehaviorを取得();

既にContainerからDaoを取得しているということは、
Containerの初期化は解決されているのですね?
ならば、「BFinder」は、
単純に「Downcast要らずでBehaviorを取得するツール」と考えてください。

Containerを直接プログラマが触るのはあまり良くないので、
それだったら個人的には「BFinder」を使うほうが良いかと思います。




ところで、トランザクションをいつどこで掛けるって解決されていますか?


念のための知識として書いておきます。
build-xxx.propertiesに以下のプロパティを追加すると、

  torque.isAvailableBehaviorRequiredTx = true

「Behaviorのメソッドで名前の後ろにTxが付いているものはトランザクション」
になります。

ex) 会員(Member)というテーブルがあるとして
MemberBhv(Gapクラス)に、独自のメソッドを作成してTxと付けると
そのメソッドがトランザクションになります。
但し、どういう単位でトランザクションを付けるかはアプリ次第なので、
この方法が適当かどうかは別問題ですが、こういう方法もあるということを
記述しておきます。




Seasar-user メーリングリストの案内