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

Kazuya Sugimoto [E-MAIL ADDRESS DELETED]
2007年 11月 9日 (金) 10:02:53 JST


杉本です。

meiさん、ご提案ありがとうございます。

提案1に関してはなるべく現在のDiconの形式を変えるのは慎重に
検討したいと思いますので、とりあえずメソッドの引数やコンストラクタの
引数の型を見て、Aspectがかかる形でコンポーネントを取得できるように
していきたいと思います。

提案2に関してはS2Container全判的に改善していきたいと思っていますが、
開発リソースのこともありますので、少し時間がかかるかもしれません。

近々、こういう場合に警告が欲しいという要望を募集したいなと思ってますので
その際はご協力お願い致します。


07/11/08 に meiさんは書きました:
> こんばんは、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が間違いなく適用されることが分かり、安心できます。
>
> ご検討頂けませんでしょうか?
>
> よろしくお願いします。



-- 
Kazuya Sugimoto
Microsoft MVP Visual Developer - Solutions Architect
http://d.hatena.ne.jp/sugimotokazuya/


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