回答我自己的问题,希望其他人会发现这很有用。
在一个新的 MVC 站点中使用 Spring.NET,我注意到一些奇怪的行为。我主要使用 Spring 来实现它的 AOP 能力,为此我利用它的 IOC 来创建命令对象。流程是:
控制器->“创建”命令对象:
var ctx = ContextRegistry.GetContext(); var updateContactCommand = (IUpdateCustomerCommand) ctx["UpdateCustomerCommand"]; 控制器 -> 使用新值设置命令对象
控制器 -> 执行命令对象,运行审计建议,该建议在数据库中创建一个审计行,其中包含命令详细信息
好东西。或者我是这么想的。
我有只在特定条件下设置特定字段的代码。但是当运行它时,我看到数据库总是存储最后一个输入的值,跨事务,即使条件不满足。该命令正在记住在先前事务中设置的值!
当然,它不记得值,只是当 Spring '创建'一个 updateContactCommand 时,它只是检索一个之前创建的 - 一个单例。
这对多线程 Web 应用程序有重大影响!使用相同命令对象的单独请求可能会导致一些非常不受欢迎的行为。
Spring.NET 的默认行为是创建一个单例,因此必须在对象声明的末尾添加“singleton=”false”,如下所示。但是,因为我使用的是 AOP,所以我的对象类型被声明为 ProxyFactoryObjects,此时单例无效。
答案仍在配置中,它是使用以下内容:
<object id="UpdateCustomerCommand" type="DataLib.Commands.UpdateCustomerCommand, DataLib" singleton="false"/>
<object type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop">
<property name="ObjectNames">
<list>
<value>UpdateCustomerCommand</value>
</list>
</property>
<property name="InterceptorNames">
<list>
<value>beforeAdvice</value>
</list>
</property>
</object>
注意 AutoProxy.ObjectNameAutoProxyCreator 的使用。
这确实每次都给了我一个新的实例,这大概也将解决多线程问题——仍有待测试!
来源: http: //forum.springframework.net/showthread.php?7027 -Lifecycle-of-objects-how-to-get-a-new-instance-for-each-call-of-GetObject ()