[seasar-dotnet:1680] Re: 2Container.NET、S2Dao.NET(Windows7)調査について

kubo [E-MAIL ADDRESS DELETED]
2010年 5月 12日 (水) 18:07:16 JST


久保(jflute)です。

Sfukuさん、ありがとうございます。
状況がわかりやすいものとなりました。

ただ、何点かもう少し具体的な情報を頂ければと。

> SingletonS2ContainerFactory.Init()
> を行った時にWindows7ではDynamicProxyを作成できていないようである。

この時、具体的にアプリケーションでは何が起きますか?
A. Init()の最中に例外が発生してしまい、アプリが何も動かない(どんな例外?)
B. Init()は正常終了で、アプリ実行時に...が起きる(その何かを具体的に)


ちなみに、試したことの追加情報として、
以前のメールの内容からすると、RealProxyにすると
問題は発生せずにDBアクセスは正常に動作した。
そして、デバッガでDynamicProxyのクラスで
Win7とそれ以外で違った挙動するポイントがあった。
具体的には、DynamicAopProxy.csの
CreateInterfaceProxy (new Type[] { _type }, target.GetType())
の戻り値に違いがあったと。(Win7だと null ?)
でしたよね!?

> S2Containerでインスタンスを管理するInterceptorを使用するので、
> SingletonS2ContainerFactory.Init()
> を行った時にWindows7ではDynamicProxyを作成できていない状況では考慮し難い。

これに関しては、そもそも Quill で同じ現象が発生するかどうか不明。
というところですよね?
DynamicProxy単体で現象が発生する環境、もしくは、
Quillで(同じ構造で)現象が発生する環境で試されてないと思うので。
(できれば、これらはあった方が良いです)

> 2 Logic のプロパティをvirtualにする
> ※Aspectを適用する為には、Inteface型で受け取るか、対象のメソッドがVirtualで
> なければならない
> public IKojinDao KojinDao
> {
>        get { return _kojinDao; }
>        set { _kojinDao = value; }
> }
>> public virtual IKojinDao KojinDao
> {
>        get { return _kojinDao; }
>        set { _kojinDao = value; }
> }
> 結果:初期化処理に成功して、Daoにアクセスできデータの検索や登録などができた
> また、DynamicProxyも作成できていた。

なるほど、Logic内のDaoのプロパティにvirtualを
付けたらうまく動作したということなのですね。
これは恐らく皆が "変な動き" と思うような現象ですね
Daoのインスタンスをプロパティにインジェクションするのに、
プロパティがオーバーライド可能かどうかは全然関係ないはずなので。

LogicクラスのDaoを呼び出しているメソッドに、
(もしくは、プロパティ以外のメソッドに)
virtual は付いていますか?
(もし、他のメソッドに virtual が付いてない場合、
その他のメソッドに virtual を付けて、プロパティには
viru)

> で考えると、"traceInterceptor"や" RequiredTx"がInteface型で受け取るか、対象
> のメソッドがVirtualでなければならないということであり、
> Info.Logic.Impl.KojinLogicImplのクラスやメソッド自体は、
> Inteface型やVirtualでなくても良い。ということになるのでしょうか。

ちょっと、表現が曖昧ですね。
まず、はっきりしているのは、traceInterceptor や requiredTx
のAOPのクラス自体のvirtualなのかどうかは無関係です。
AOPを掛ける対象のクラス (KojinLogicImpl) における、
AOPを掛ける対象のメソッドが virtual という話です。

ただちょっと、"Inteface型で受け取るか" の部分の仕様を
忘れてしまいました...。Quill使ってると、Interfaceを
作らないことが多いので、Interfaceを付けたときに
どうなるか、ほとんど試したこと無いので...

動作するケース(2番)があるのであれば、実際にAOPが
掛かっているかどうか、試してみると良いと思います。
(virtual付けたときと付けないときと)


#
# 丸付き数字は極力避けた方がいいですよ
#


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