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