[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 メーリングリストの案内