[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 メーリングリストの案内