[seasar-dotnet:1630] Re: Transaction 属性をつけたクラスにはDIされない?

kubo [E-MAIL ADDRESS DELETED]
2010年 3月 24日 (水) 10:09:57 JST


久保(jflute)です。

>>>> 全く未検証で申し訳ないのですが、
>>>> 属性を逆にしてみても同じですか。
>>>> #以前同じような現象に出くわしたような気がして。。。

一応、これに関してコメントしておきます。
(メーリングリストの履歴(ログ)を見る人のために)

基本的には、属性の順序でどうのこうのってあり得ないはずですが、
S2Dao属性だけはあり得る「かも」しれません。
(もし、DaoにAOPを掛けるような場合において)

S2DaoのAOPは特別で、AOPというかそのまま実処理をする
Interceptorが実行されます(メソッドの規約に基づいて)。
なので、Daoは実装クラスが存在しないでも動くわけです。

もしかしたら、Daoにおいては、属性の順序次第で、S2Daoの
AOPの後に動作すると解釈されるAOPは動かないかもしれません。
(未検証)
実際にJava版のS2Daoでは、diconファイルにおいて、
S2DaoInterceptorの後ろに設定したInterceptorは動作しません。
(S2DaoInterceptorで処理が完結してしまうため: チェーンしない)

もし、Daoにおいて似たような現象が発生した場合は、
まずはこの点を疑うと良いかもしれません。
(S2Dao属性の付与順序を変えてみるとか)


#
# DBFlute.NETでは、DaoにAOPを掛けるオプションは
# ないので関係ないです。(フィルタ処理は基本Behaviorで)
#

2010/3/23 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。
>
> 川上さん、こんにちは
> (ikutirinさん、フォローありがとうございます)
>
> これはドキュメントがもうちょい改善されるべきですね。
>
> http://s2container.net.seasar.org/ja/quill.html#di_quill
>
> 取り急ぎ、DI対象となるアクセス修飾子についての記述を、
> DIの説明の目立つところに書いておきました。
> 基本的には protected と、しておくのが一番無難です。
> (特に大人数に横展開するような場合は)
>
> 2010/3/19 Tatsuharu Kawakami <[E-MAIL ADDRESS DELETED]>:
>> 川上です。
>>
>> 自己解決しました。
>>
>> Quillではprivateメソッドを含め、すべてのフィールドに対してDI対象かどうかを問い合わせるようなのですが、
>> Aspectが適用されたProxyクラスは、もとのオブジェクトのprivateフィールドをType.GetFieldsで取得できないためDIできません。
>>
>> というところを突き止めたのですが、
>> ここに書いてありましたorz..
>> http://s2container.net.seasar.org/ja/quill.html#di_notice
>>
>> 大変失礼しました。
>>
>>
>> 2010年3月19日17:14 Tatsuharu Kawakami <[E-MAIL ADDRESS DELETED]>:
>>> 川上です。
>>>
>>> ikutirinさん
>>>
>>> 念のため逆にしてみましたし、メソッドにTransactionをつけてもダメでした。
>>> リビルドも行いましたがダメでした。
>>>
>>> Aspectタグで適当なInterceptorをつけてみましたが、やはりダメでした。。。
>>>
>>>
>>> 2010年3月19日16:33 ikutirin <[E-MAIL ADDRESS DELETED]>:
>>>> ikutirinです。
>>>>
>>>> 全く未検証で申し訳ないのですが、
>>>> 属性を逆にしてみても同じですか。
>>>> #以前同じような現象に出くわしたような気がして。。。
>>>>
>>>>  [Transaction]
>>>>  [Implementation]
>>>>  public class HogeAction
>>>>
>>>> 関係ないでしょうか。。。
>>>>
>>>> #Transaction属性はクラスでも有効でしたでしょうか。。。
>>>> #私はメソッド派です。
>>>>
>>>>
>>>>
>>>>
>>>> Tatsuharu Kawakami <[E-MAIL ADDRESS DELETED]> wrote:
>>>>
>>>>> 川上です。
>>>>>
>>>>> Quillを検証している最中で疑問に思うことがあるので確認させてください。
>>>>>
>>>>> 下記のクラスで、Transaction属性をつけなかった場合は、logicフィールドに期待するオブジェクトが設定されるのですが、
>>>>> Transaction属性をつけた場合、logicフィールドがnullとなってしまいました。
>>>>> ソースコードを眺めた感じでは、Aspectを適用するクラスにはインジェクションがされないようなのですが、これは仕様でしょうか?
>>>>>
>>>>>
>>>>>     [Implementation]
>>>>>     [Transaction]
>>>>>     public class HogeAction
>>>>>     {
>>>>>         private HogeLogic logic = null;
>>>>>
>>>>>         public virtual void BatchInsert()
>>>>>         {
>>>>>             Console.WriteLine(logic == null ? "ぬるっ" : logic.ToString());
>>>>>         }
>>>>>     }
>>>>>
>>>>>
>>>>> 使用している環境
>>>>> s2container.net-1.3.17
>>>>> VisualStudio2008
>>>>> .NET Framework3.5
>>>>>
>>>>> よろしくお願いします。
>>>>>
>>>>> --
>>>>> --------------------------------------
>>>>> Tatsuharu Kawakami
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> _______________________________________________
>>>>> 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
>>>>
>>>
>>>
>>>
>>> --
>>> --------------------------------------
>>> Tatsuharu Kawakami
>>> [E-MAIL ADDRESS DELETED]
>>>
>>
>>
>>
>> --
>> --------------------------------------
>> Tatsuharu Kawakami
>> [E-MAIL ADDRESS DELETED]
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>


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