2012-09-06 28 views
2

我是C#的新手,但是Java在Spring中是exp。我可以使用Spring示例项目Spring.WcfQuickStart.2010轻松地重现我的问题。Spring.net,导致属性不能设置的AOP

在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> 

我也可以只改变值=“Spring.WcfQuickStart。*”别的东西,但后来我有我的代码没有问题。

任何帮助非常感谢。

回答

0

尝试将您的属性设置为“虚拟”。我发现如果在使用AOP时属性不是虚拟的,通常您会看到空值/默认值。

+0

相当烦人,这工作。它确实使用了Spring DI和AOP马车,因为它编译和运行,但会在生产中造成许多未知的问题。 – user815809

+0

另一个可行的解决方案是创建一个接口ITestDI并实现公共类TestDI:ITestDI。该接口将定义public int test {get;组; }。 – user815809

相关问题