2

私はC#は初めてですが、JavaのSpringで経験を積んでいます。Spring サンプル プロジェクト Spring.WcfQuickStart.2010 を使用して、問題を簡単に再現できます。

Spring.WcfQuickStart.ServerApp.2010 プロジェクトで、次を実行します。

1) 次の TestDI クラスを追加します。

namespace Spring.WcfQuickStart
{
    public class TestDI
    {
        public int test { get; set; }

        public TestDI()
        { 
            this.test = 10;
            Console.WriteLine("TestDI cons called, value set to {0}", test);
        }
    }
}

2) CalculatorService.cs で、"ServerApp Calculator testDI value=" + tdi.test; を返します。

3) App.config で次の操作を行います。

<object id="testObj" type="Spring.WcfQuickStart.TestDI, Spring.WcfQuickStart.ServerApp" singleton="true"/> 

  <object id="calculator" singleton="true"
          type="Spring.WcfQuickStart.CalculatorService, Spring.WcfQuickStart.ServerApp">
    <property name="tdi" ref="testObj"/>
    <property name="SleepInSeconds" value="1"/>
</object>

ここで、プログラムを実行すると、クライアントには値 10 が返されると予想されますが、私は値 0 を取得しています。これは、私が定義するどのプロパティでも同じです。TestDI プロパティ テストが静的に変更された場合、同じ問題が発生します。

これを防ぎ、値 10 を取得する唯一の方法は、App.config ファイルから以下を削除することです。

<object id="serviceOperation" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
    <property name="pattern" value="Spring.WcfQuickStart.*"/>
</object> 

value="Spring.WcfQuickStart.*" を別のものに変更することもできますが、コードに側面がありません。

どんな助けでも大歓迎です。

4

2 に答える 2

0

プロパティを「仮想」に設定してみてください。AOP で作業するときにプロパティが仮想でない場合、多くの場合、null/デフォルト値が表示されることがわかりました。

于 2012-09-06T16:44:05.233 に答える
0

この理由は、Spring.NET ドキュメントのセクション 13.6 で説明されています: http://www.springframework.net/doc-latest/reference/html/aop.html#aop-proxy-mechanism。継承ベースのメカニズムを使用しているようです。

于 2012-10-30T11:41:14.957 に答える