[Seasar-user:382] AOP-DAO
B gluegent.com Masataka Kurihara
kurihara
2004年 3月 2日 (火) 19:13:05 JST
栗原です。
私はちょっと違う(?)予想をしてました。Core Concern に永続化を
おかずに、Crosscutting Concern に位置づけて考えて見ます。無理押し
にケース考えているので、例が業務モデル的にはアレでも無視してくださ
いね。
#Core Concern たるコンポーネントのインターフェイス
public interface MonthlyService {
public List calcSalary(List emptranList);
}
#その実装
public class MonthlyServiceImpl {
public List calcSalary(List empList) {
for(Iterator it = empList.iterate(); it.hasNext();) {
Employee emp = (Employee)it.next();
long salary = ...給与計算する...
emp.setSalary(salary);
}
return empList;
}
}
とまあ、Core に給与計算だけやるわけですね。ここに、
SqletのXML、ひがさんの例の一部をそのまま引用
#EmployeeDao.xml
> <dao>
> <view name="EmployeeView">
> SELECT ... FROM emp
> </view>
>
> <query name="getEmployees">
> <resultSetHandler class="BeanListHandler">
> <property name="beanClassName">'hoge.entity.Employee'</property>
> </resultSetHandler>
> ${EmployeeView}
> </query>
>
> </dao>
#コンポーネントの定義はこんなイメージ
<component class="hoge.dao.MonthlyServiceImpl">
<!-- ちょっと簡便にタグ階層少なく書きたいな〜 -->
<aspect class="org.seasar.framework.dao.advices.DaoAdvice">
<arg>jdbc/default</arg>
<arg>hoge/dao/EmployeeDao.xml</arg>
<!--実行するSQLクエリ-->
<arg>getEmployees</arg>
<!--Core Concern のメソッドの何番目に結果をセット?-->
<arg>0</arg>
<!--取得時に全部フェッチしちゃう?-->
<arg>false</arg>
<pointcut method="calcSalary"/>
</aspect>
</component>
#クライアントからの呼び方
MonthlyService srv =
(MonthlyService)container.getComponent(MonthlyService.class);
/* なんかこのメソッド呼び出しでnullなのがダサいですが。。。 */
List result = src.calcSalary(null);
for(Iterator it = result.iterate(); it.hasNext();) {
Employee emp = (Employee)it.next();
long salary = emp.getSalary();
/* 給与支払いします */
}
#DaoAdvice
public class DaoAdvice implements AroundAdvice {
private DataSource source;
String xmlPath;
String queryName;
int argNo;
boolean fetchMode;
/* Crosscutting Concern */
public Object invoke(Joinpoint joinpoint) throws Throwable {
1)まずSqlet-XMLを処理
2)SQL実行
3)結果セットをマッピング−バインド
Object[] args = joinpoint.getArgs();
args[argNo] = 結果のリスト
...ああ、ファサードされているから突っ込めない!でも
所詮アイディアスケッチだからその矛盾は無視。
Object ret = joinpoint.proceed();
4)クリーンアップ処理
}
}
以上はSelectしか考えてないし、ダサいところ多いのですが、こうい
うのをAOP-DAOではイメージしてました。
--
株式会社グルージェント
栗原 傑享(くりはら まさたか)
渋谷区渋谷3-7-6 第6矢木ビル4F
TEL:03-5469-8869 FAX:03-5469-8879
URL:http://www.gluegent.com/
--
Seasar-user メーリングリストの案内