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

西山はじめ [E-MAIL ADDRESS DELETED]
2010年 5月 12日 (水) 18:30:46 JST


hajimeniです。

横から失礼します。

Quillですが、以下のOSで全て動作しています。

Windows7
WindowsVista
Windows Server 2008

S2Dao.netではないですが、同じくInterface型だけで利用するS2Fisshplate.NETを利用していますので、参考になればと思います。
(Quillはフィールドインジェクションが出来ますのでプロパティではありませんが・・・)

また、他にもAspectをかける箇所は、必ず「virtual」メソッドにしています。

それはそれとして、Aspectで「Inteface型で受け取るか」って部分は、
componentを「KojinLogicImpl」で登録して、
使うときにインターフェースを指定して
// プロパティ
public IKojinLogic KojinLogic
{get; set;}
として使うってことじゃないでしょうか?
(これを使う方もコンポーネント登録が必要でしょうが)

たしか、GetComponent(interface)とすると、interfaceを実装しているクラスも探しに行くことが出来たと思うのですけど。

// 現象を見る限り、Pointcutの指定によって、プロパティへのインジェクションが阻害されている感じですね。

2010年5月12日18:07 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>



-- 
--
西山はじめ


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