[seasar-dotnet:632] アスペクトを適用したオブジェクトの取得について

mei [E-MAIL ADDRESS DELETED]
2007年 11月 8日 (木) 01:19:45 JST


こんばんは、meiです。

AOPを使っていて、少し困った状況になりました。

次のようなインタフェースがあったとします。
interface IFoo {
    void Bar();
}

実装クラスとして

class FooImpl : IFoo { ... }
class Foo2Impl : IFoo { ... }

これら2つのクラスを用意しました。

このクラスをdiconファイルに登録しますが、同一インタフェースの実装が2つある
ので、
<component class="FooImpl" name="fooImpl">...</component>
<component class="Foo2Impl" name="foo2Impl">...</component>
と、name属性を使って区別するようにしました。

更に、このfooImpl/foo2Implを他のオブジェクトにインジェクションしたいので、
<initMethod name="XXX"><arg>fooImpl</arg></initMethod>
としましたが、実はfooImplにはaspectがあり、AOPを適用しているつもりでした。
しかし、このinitMethodの書き方だとAOPが適用されていない状態のオブジェクト
が、
インジェクションされることになります。

解決案としては、
1. MarshalByRefObjectから継承させる
2. Seasar.DynamicProxyを使い、メソッドをvirtualにする
これらが考えられます。とりあえず、1案にして対応しましたが、多重継承を許さな
いC#(.NET)で、
親クラスにMarshalByRefObjectを使ってしまうのは勿体ないです。

そこで提案ですが、インタフェース経由でした使用しないことが分かっているオブ
ジェクトについては、
Diconファイル中で明示的にインタフェースを指定可能に出来ませんでしょうか?

例
<component class="FooImpl" interface="IFoo" name="fooImpl">...</component>

上記のようにinterfaceが指定されている場合は、常にインタフェース経由扱いにな
ると、個人的には助かります。

今回適用していたAOPはTransactionInterceptorでして、
テスト中に、特定のオブジェクトだけコミットされずに焦りました。(^^;


提案2
aspectが指定されたオブジェクトがMarshalByRefObjectから派生していなかったり、
インタフェース指定での取得で無かった場合にトレース出力で警告が出ると有り難い
です。AOPが無効になっているのを見落としてしまうと影響が大で、怖いです。

あと、見落としに関連して、提案1の場合、
<component ... interface="IFoo" ...>
  <aspect>XXXInterceptor</aspect>
</component>
このように、diconファイル内でinterface属性とaspectを確認できるので、
AOPが間違いなく適用されることが分かり、安心できます。

ご検討頂けませんでしょうか?

よろしくお願いします。




seasar-dotnet メーリングリストの案内