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

koyak kotani.k @ buildsystem.jp
2006年 12月 15日 (金) 00:25:03 JST


くろいわ様

初めまして。小谷と申します。

instance=sessionのときにプロキシを返す処理を実際に行う
メソッドを見てみたところ、確かに最初の一回目の
生成時はGetProxyからプロキシオブジェクトが
生成されて返されていますが、
2回目(sessionにcomponent(実装クラス)が乗っている状態)の
ときにはその中の実装クラスが返されるように
なっているように見えますね。

-----------------------------------------------------------
Seasar.Framework.Container.Deployer.SessionComponentDeployer

public override object Deploy(Type receiveType)
{
	(途中省略)
	object component = session[componentName];
	if(component != null) return component;
	
	component = this.ConstructorAssembler.Assemble();
	session[componentName] = component;
	this.PropertyAssembler.Assemble(component);
	this.InitMethodAssembler.Assemble(component);

	object proxy = GetProxy(receiveType);
	return proxy == null ? component : proxy;
}
-------------------------------------------------------------

実際に動かして試してみたわけではないので
的外れなことを言ってしまっているかもしれませんが、
session[componentName] = component;
をGetProxyの後ろの方にもってきて、
return proxy == null ? component : proxyの代わりに
if( proxy == null ){
	session[componentName] = component;
	return component;
}
else{
	session[componentName] = proxy;
	return proxy;
}
としてみると如何でしょうか?

===========================
koyak
kotani.k @ buildsystem.jp
===========================

tomoaki.kuroiwa @ informatix.co.jp wrote:
> 
> はじめまして、くろいわと申します。
> いつも大変お世話になっております。
> 
> 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は標準実装を利用しています。
> 
> カットオーバー間際に、はまっております。
> どうぞ、よろしくお願いいたします。
> 
> くろいわ
> 
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 
> 



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