[seasar-dotnet:420] Re: S2AOP.NET でinstance=sessionのコンポーネントでAOPが効かない

Kazuya Sugimoto sugimotokazuya @ gmail.com
2006年 12月 15日 (金) 01:41:00 JST


杉本です。

くろいわさん、こんばんは。
遅くなってしまいました。

申し訳ございません。テスト環境を作成して調査していたのですが、
再現しました。バグです。

お急ぎだと思いますので、とりあえず以下のクラスを変更していただけないでしょうか?
Seasar.Framework.Container.Deployer.SessionComponentDeployer

Deployメソッドの object component = session[componentName];以下を
下のように変更してください。

object component = session[componentName];
if(component != null) return component;

component = this.ConstructorAssembler.Assemble();

this.PropertyAssembler.Assemble(component);
this.InitMethodAssembler.Assemble(component);

object proxy = GetProxy(receiveType);

component = proxy == null ? component : proxy;
session[componentName] = component;

return component;

ただし簡単なテストしか行えておりませんので、変更後のテストは十分に
行って下さい。

# requestスコープの場合でも同じバグがあり、request中であれば1回目しか
# Aspectがかかりません。同様の修正が必要です。


06/12/14 に tomoaki.kuroiwaさん さんは書きました:
>
>
> はじめまして、くろいわと申します。
> いつも大変お世話になっております。
>
> S2AOP.NETをASP.NETにて使用しています。S2AOP.NETについて質問です。
> App.diconで定義したinstance=sessionと設定したコンポーネントを、aspx.csの
> Page_Load()上で取得しています。
> このコンポーネントですが、1回目取得したときはAOPのプロキシオブジェクトが
> 返ってくるようなのですが、
> 2回目以降は実体のオブジェクトの方が返って来てしまいます。なのでAOPが効きま
> せん。
> (ブラウザの再読込みボタンで確認しました。セッションは維持できています。)
>
> AOPでロギングしているため、毎回プロキシオブジェクトの方を取得する必要があり
> 困っています。
> どうすれば解決できるのかアドバイス頂けませんでしょうか。
>
> ■App.dicon
> <?xml version="1.0" encoding="utf-8" ?>
> <components>
>       <component name="echo" class="Hello" instance="session">
>             <property name="Session">session</property>
>             <aspect pointcut=".*">measurement</aspect>
>       </component>
>       <component name="measurement" class="MeasurementInterceptor" />
> </components>
>
>
> ■aspx.cs
> protected void Page_Load(object sender, EventArgs e)
> {
>       Response.Cache.SetCacheability(HttpCacheability.NoCache);
>
>       IHello hello =
> (IHello)SingletonS2ContainerFactory.Container.GetComponent(typeof(IHello),
> "echo");
>       string msg = string.Empty;
>
>       if(hello is Hello)      //1回目はfalseになる。2回目以降はtrueになる
>       {
>             msg = "プロキシじゃないです";
>       }
>       else
>       {
>             msg = "プロキシです";
>       }
>       Label1.Text = hello.Echo("こんにちは") + " " + msg;
> }
>
>
> 現在の環境は以下の通りです。
> VB2005、ASP.NET2.0(C#)、S2Container.NET 1.2.7
> S2AOP.NETは標準実装を利用しています。
>
> カットオーバー間際に、はまっております。
> どうぞ、よろしくお願いいたします。
>
> くろいわ



-- 
Kazuya Sugimoto
http://d.hatena.ne.jp/sugimotokazuya/


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