[seasar-dotnet:1510] [Quill]AOP利用時、引数ウィンドウハンドルの値が変わってしまう。

Yuriko Ohguchi [E-MAIL ADDRESS DELETED]
2009年 10月 7日 (水) 14:28:02 JST


はじめまして、大口といいます。

今回初めてQuillを利用させていただきましたが
標題の件で困ってしまったため報告させていただきます。

 開発環境:Microsoft Visual Studio 2005 Ver 8.0.50727.762  (SP.050727-7600)
 開発言語:C#(.NET Framework Ver 2.0.50727 SP2)
 S2Container.NET 1.3.16.1利用

Quillのコンテナで管理しているサービスにAOPを用いた際、
サービスのメソッド引数に設定したウィンドウハンドルの値が
変更されてしまいました。
(具体的には下記のサンプルソース および 実行結果 をご参照ください)

今回は、ウィンドウハンドルを渡す必要のあるメソッドには
AOPを利用しないよう修正して対応をしましたが
もっと根本的な解決方法はありませんでしょうか?

ご教授よろしくお願いいたします。


以下、サンプルソースとなります。

//フォーム
namespace Seasar.S2FormExample.Forms
{
    public partial class FrmMainMenu : Form
    {
        protected IHogeService hogeService;
        public FrmMainMenu()
        {
            InitializeComponent();
        }
        private void btnHoge_Click(object sender, EventArgs e)
        {
            System.Console.WriteLine("★A:" + Handle.ToString());   // ★A
            hogeService.Test1(Handle);
            hogeService.Test2(Handle);
            System.Console.WriteLine("★D:" + Handle.ToString());   // ★D
        }
    }
}

//インターセプタ
namespace Seasar.S2FormExample.Forms.Interceptor
{
    public class ConsoleWriteInterceptor : IMethodInterceptor
    {
        public object Invoke(IMethodInvocation invocation)
        {
            MethodBase method = invocation.Method;
            Console.WriteLine("メソッドを開始します");
            object ret = invocation.Proceed();
            Console.WriteLine("メソッドを終了します");
            return ret;
        }
    }
}

//サービス
namespace Seasar.S2FormExample.Logics.Service
{
    [Implementation(typeof(HogeServiceImpl))]
    public interface IHogeService
    {
        void Test1(IntPtr h);
        void Test2(IntPtr h);
    }
}
namespace Seasar.S2FormExample.Logics.Service.Impl
{
    public class HogeServiceImpl : IHogeService
    {
        public void Test1(IntPtr h)
        {
            System.Console.WriteLine("★B:" + h.ToString());   // ★B
        }

        [Aspect(typeof(ConsoleWriteInterceptor))]
        public void Test2(IntPtr h)
        {
            System.Console.WriteLine("★C:" + h.ToString());   // ★C
        }
    }
}


<<実行結果>>
★A:1313154
★B:21142624
メソッドを開始します
★C:21142996
メソッドを終了します
★D:1313154

※期待値は、★C、★Dともに「1313154」です。

<<補足>>
・QuillのTransaction属性を利用した際も、この現象は発生しました。
・S2コンテナを利用したサービスにきりかえた場合や
 Quill利用でも、AOPを利用しない(DIのみ)の場合では
 このような現象はありませんでした。


以上です。
よろしくお願いいたします。




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