[seasar-dotnet:1677] Re: 2Container.NET、S2Dao.NET(Windows7)調査状況

Sohei Fukumura [E-MAIL ADDRESS DELETED]
2010年 5月 12日 (水) 14:39:33 JST


お世話になっております。
Sfukuです。
久保(jflute)様、返信ありがとうございます。

よくよく考えたら、勘違いをしていた可能性があります。
基本的な事で申し訳ありませんが、
『Aspectを適用する為には、Inteface型で受け取るか、対象のメソッドがVirtualでなければならない』
というのは、
  <component class="Info.Logic.Impl.KojinLogicImpl" >
    <aspect>traceInterceptor</aspect>
    <aspect pointcut=".*">RequiredTx</aspect>
  </component>
で考えると、"traceInterceptor"や" RequiredTx"がInteface型で受け取るか、対象のメソッドがVirtualでなければならないということであり、
Info.Logic.Impl.KojinLogicImplのクラスやメソッド自体は、
Inteface型やVirtualでなくても良い。ということになるのでしょうか。

となると、昨日の
<< Logic のクラス>>
public class KojinLogicImpl : IKojinLogic {
       private IKojinDao _kojinDao;
      ※ public virtual IKojinDao KojinDao       
	{
           get { return _kojinDao; }
           set { _kojinDao = value; }
       }

	public virtual…
}
public IKojinDao KojinDaoをpublic virtual IKojinDao KojinDaoに
変更したら、問題なく動作したというのはたまたま動作したと
いうことだけになります。
※KojinLogicImplクラスを親としたクラス等は作成しておりませんし、
 内部の処理を他のクラスなどで<aspect>しておりません。

IKojinDaoはKojinLogicImplよりも前に初期化されているように
Diconファイルを記載しているにも関わらず、IKojinDaoが初期化される時に、
IKojinDao _kojinDaoの値がNULLになっております。
ということはやはり、IKojinDaoが作成されていないということでしょうか。
でも、以前のお話で、
  <component class="Info.Logic.Impl.KojinLogicImpl" >
    <aspect>traceInterceptor</aspect>
    <aspect pointcut=".*">RequiredTx</aspect>
  </component>
の
    <aspect>traceInterceptor</aspect>
    <aspect pointcut=".*">RequiredTx</aspect>
を外したら、データベースに接続して、
色々な処理を行うことができたということもあります。
従って、
IKojinDaoは作成されているけどKojinLogicImplに
渡せていないということになるのでしょうか。


以上、よろしくお願い致します。
-----Original Message-----
From: [E-MAIL ADDRESS DELETED] [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of kubo
Sent: Tuesday, May 11, 2010 5:28 PM
To: [E-MAIL ADDRESS DELETED]
Subject: [seasar-dotnet:1676] Re:2Container.NET、S2Dao.NET(Windows7)調査状況

久保(jflute)です。

> しかし、こうなると今までXPやVistaでは奇跡的に
> 動作していたということになってしまい、逆に不安となります。

ふむぅ、恐らく、XPやVistaの環境で、
virtualを付けてなかったときは、
トランザクション(AOP)が効いてない状態で、
動作していたんじゃないかと思われます。
(virtualが付いてないと、AOP掛からないのですが、
特に例外などは発生せずに動作はする、という認識です)

それが、Win7だと、そういった状態における挙動が
ちょっと違うってことかもしれませんね。

2010/5/11 Sohei Fukumura <[E-MAIL ADDRESS DELETED]>:
> お世話になっております。
> Sfukuです。
> 久保(jflute)様、返信ありがとうございます。
>
>> Quillを使った場合の
>>ほぼ同じ構造(Logic + Dao)でエラーが発生するか
>>どうか試してみると良いと思います。
>>DaoのAOPが関係ないとなると、もう一度この点を
>>疑って、しっかり状況を明確にするのもいいのかなと。
> というアドバイスを頂きまして、再度ソースを確認致しました。
> 特に、DaoのAOPが関係なさそうなので、Logicの方を疑って
> 再度見直しました。
> <<http://s2container.net.seasar.org/ja/quill.html#nodicon_tx>>
> クラスの場合、トランザクションは AOP を利用しますので
> virtual キーワードの定義が重要とのことでした。
>
> ⇒Logicのクラスを全て見直した所、各メソッドにvirtualを
> 定義し忘れておりました。
> XPでは動作しておりましたのでこの観点についてチェックが甘かったです。
> Logicのクラスの各publicにvirtualを定義しなおした所
> << Logic のクラス>>
> public class KojinLogicImpl : IKojinLogic
> {
>       private IKojinDao _kojinDao;
>       public virtual IKojinDao KojinDao
>       {
>           get { return _kojinDao; }
>           set { _kojinDao = value; }
>       }
>
>        public virtual…
> }
> 無事、Quillをを使用しなくても
> LogicにおいてDynamicProxsyで動作することを
> 確認できました。
> 度々、ご質問させていただきました割には
> 単純なミスで申し訳ありませんでした。
>
> しかし、こうなると今までXPやVistaでは奇跡的に
> 動作していたということになってしまい、逆に不安となります。
>
> 以上、よろしくお願い致します。
>
> -----Original Message-----
> From: [E-MAIL ADDRESS DELETED] [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of kubo
> Sent: Monday, May 10, 2010 7:23 PM
> To: [E-MAIL ADDRESS DELETED]
> Subject: [seasar-dotnet:1674] Re:2Container.NET、S2Dao.NET(Windows7)調査状況
>
> 久保(jflute)です。
>
>> そうすると、次は何故LogicだとNGになるのか。
>> が観点になってくるので、
>> その辺りを中心に調査を継続したいと思います。
>
> Daoは、実装クラスが存在せず、インターフェースに
> 直接AOPを付与して、Interceptorにそのまま処理を
> 任せているため、AOPの利用の仕方としては、
> 非常に特殊なものではあります。
> そういう意味では、Logicのようなオーソドックスな
> 利用方法の場合に発生する現象と言えるかもしれませんね。
>
> もし、余裕があれば、Quillを使った場合の
> ほぼ同じ構造(Logic + Dao)でエラーが発生するか
> どうか試してみると良いと思います。
> DaoのAOPが関係ないとなると、もう一度この点を
> 疑って、しっかり状況を明確にするのもいいのかなと。
> もし、同じエラーが発生すればQuillでも共通の話と
> なるので、他の人も検証しやすくなるかなと。
> やはり、Quillでは発生しないと確定したらしたで、
> その違いを探ることで原因が掴みやすくなります。
>
> 2010/5/10 Sohei Fukumura <[E-MAIL ADDRESS DELETED]>:
>> お世話になっております。
>> Sfukuです。
>> 久保(jflute)様、返信ありがとうございます。
>>
>>> A. traceInterceptor だけを適用の実験
>> Logicクラスのエンハンスが失敗する。
>>
>>> B. requiredTx だけを適用の実験
>> Logicクラスのエンハンスが失敗する。
>>
>>>Win7 + DynamicProxyで、AOP利用の可否が、
>>>「DaoだとOKだが、LogicだとNG」
>>>という状況がとりあえず判明したって感じですね。
>> ありがとうございます。
>> そうすると、次は何故LogicだとNGになるのか。
>> が観点になってくるので、
>> その辺りを中心に調査を継続したいと思います。
>> Logic及びDaoのクラス・インタフェースの定義は下記のようになります。
>> << Logic のクラス>>
>>  public class KojinLogicImpl : IKojinLogic
>>  {
>>        private IKojinDao _kojinDao;
>> //<< Daoのインターフェース>>をprivateで宣言している
>>        public IKojinDao KojinDao
>>        {
>>            get { return _kojinDao; }
>>            set { _kojinDao = value; }
>> //XP,VistaではSingletonS2ContainerFactory.Init(); 時に
>> //set { _kojinDao = value; }が実行されるが
>> //Win7では実行されない
>> //※ここを見て『Daoの生成がうまくいかない』と考えておりました※
>>        }
>>>> }
>>
>> << Logic のインタフェース>>
>> public interface IKojinLogic
>> {
>>        KojinDS FindSearch(Kojin dto);
>> }
>>
>> << Daoのクラス>>
>> [Table("T_KOJIN")]
>> public class Kojin
>> {
>>        private System.String _HOSPID;
>>
>>        public System.String HOSPID
>>        {
>>            get { return _HOSPID; }
>>            set { _HOSPID = value; }
>>        }
>> }
>>
>> << Daoのインターフェース>>
>>  [Bean(typeof(Kojin))]
>> public interface IKojinDao
>> {
>>        IList<Kojin> FindSearch(Kojin dto);
>> }
>>
>>
>> 以上、よろしくお願い致します。
>> -----Original Message-----
>> From: [E-MAIL ADDRESS DELETED] [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of kubo
>> Sent: Monday, May 10, 2010 5:24 PM
>> To: [E-MAIL ADDRESS DELETED]
>> Subject: [seasar-dotnet:1668] Re:2Container.NET、S2Dao.NET(Windows7)調査状況
>>
>> 久保(jflute)です。
>>
>>> はい。Win7 で DynamicProxy を利用した環境でも、
>>> 検索してデータを実際に取得できました。
>>
>> なるほど、すると、Daoインターフェースのエンハンス自体は
>> うまくいっていて、Logicクラスのエンハンスがうまく
>> いっていないってことになりますね。
>> (もともとDaoの生成がうまくいかないって話になっていた
>> と思いますが、Logicの生成がうまくいかないって話になるのかと)
>>
>> 試しに、Logicクラスに、
>> A. traceInterceptor だけを適用
>> B. requiredTx だけを適用
>> して、もう一度試してみて下さい。
>> これで、Interceptorの違いが影響するのか
>> どうか(の可能性)が確認できます。
>>
>>> Win7 で DynamicProxy を利用できていないが、
>>> IKojinDaoを経由してDBアクセスを実行することができた。
>>> ということになるのでしょうか。
>> IKojinDaoでは、DynamicProxyを使っているので、
>> 微妙にこの表現は違います。
>> ("Win7 で DynamicProxy を利用できていないが" の部分)
>>
>> Logic -- DynamicProxyを使ってない (AOPを外した)
>> Dao -- DynamicProxyを使っている (そもそもAOPが必須)
>>
>> Win7 + DynamicProxyで、AOP利用の可否が、
>> 「DaoだとOKだが、LogicだとNG」
>> という状況がとりあえず判明したって感じですね。
>>
>> 2010/5/10 Sohei Fukumura <[E-MAIL ADDRESS DELETED]>:
>>> お世話になっております。
>>> Sfukuです。
>>> 久保(jflute)様、返信ありがとうございます。
>>>
>>>>KojinLogicImplからaspect属性を全て排除したら、
>>>>Win7 で DynamicProxy を利用した環境でも、
>>>> (IKojinDaoを経由して)DBアクセスを実行することが
>>>>できた(例えば、検索してデータを実際に取得できた)、
>>>>ということでしょうか?
>>> はい。Win7 で DynamicProxy を利用した環境でも、
>>> 検索してデータを実際に取得できました。
>>>
>>>>KojinLogicからaspect属性を全て排除したということは、
>>>>KojinLogic には AOP が掛からない、とということです。
>>>>なので、"DynamicProxyではない" というか、
>>>>"そもそもこのクラスに対して Proxy を適用しない"
>>>>という解釈
>>> という事ですので、
>>> Win7 で DynamicProxy を利用できていないが、
>>> IKojinDaoを経由してDBアクセスを実行することができた。
>>> ということになるのでしょうか。
>>>
>>>
>>> 以上、よろしくお願い致します。
>>>
>>> -----Original Message-----
>>> From: [E-MAIL ADDRESS DELETED]
>>> [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of kubo
>>> Sent: Monday, May 10, 2010 4:30 PM
>>> To: [E-MAIL ADDRESS DELETED]
>>> Subject: [seasar-dotnet:1665] Re:2Container.NET、S2Dao.NET(Windows7)調査状況
>>>
>>> 久保(jflute)です。
>>>
>>> Sfukuさん、こんにちは
>>>
>>>> 1『traceInterceptor』や『RequiredTx』の使い方が悪いため、
>>>> 『traceInterceptor』や『RequiredTx』をaspectするとエラーが発生するのでしょ
>>>> うか。
>>>>
>>>> 2『traceInterceptor』はトレースを出力のため問題ない気がしますが、
>>>> 『RequiredTx』はTransactionを織り込んでいるため、
>>>> 『RequiredTx』をaspectしない場合、機能によっては問題が発生する可能性があ
>>>> る。
>>> ※丸付き数字を普通の数字に変えました。
>>>
>>> <1>
>>> Win7限定でエラーが出る原因がそもそも
>>> わかってないので、こういう質問をされても
>>> やっぱり、わからない、としか言いようがありません。
>>> ただ、Win7でなければちゃんと動いているので(そうなんですよね?)、
>>> 少なくとも使い方が悪いからっていうのは想像しにくいですね。
>>>
>>> <2>
>>> "機能によっては問題が発生する可能性がある"  かどうかは、
>>> アプリでの要件次第かと。ただ、通常はトランザクションなし
>>> でDBアクセスするというのは業務的に問題があることが
>>> 多いとは思われます。
>>>
>>>> そもそも<aspect>を全て排除したということは
>>>> Dynamicproxsyではないということでしょうか。
>>> KojinLogicからaspect属性を全て排除したということは、
>>> KojinLogic には AOP が掛からない、とということです。
>>> なので、"DynamicProxyではない" というか、
>>> "そもそもこのクラスに対して Proxy を適用しない"
>>> という解釈になります。
>>>
>>>> 次の記載に修正すると、DynamicProxsyでも動作する。
>>>>  <component class="Info.Logic.Impl.KojinLogicImpl" >
>>>>  </component>
>>>> ・・・
>>> ここちょっと大事ですね。
>>> 状況を詳しく確認させて下さい。
>>>
>>> KojinLogicImplからaspect属性を全て排除したら、
>>> Win7 で DynamicProxy を利用した環境でも、
>>> (IKojinDaoを経由して)DBアクセスを実行することが
>>> できた(例えば、検索してデータを実際に取得できた)、
>>> ということでしょうか?
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
_______________________________________________
seasar-dotnet mailing list
[E-MAIL ADDRESS DELETED]
https://ml.seasar.org/mailman/listinfo/seasar-dotnet


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