Spring.NET - 应用程序上下文 - 创建对象 - 共享实例

时间:2012-08-22 11:37:25

标签: asp.net-mvc spring.net

我正在使用Spring.NET创建我的Command对象(附带建议)并在MVC Web应用程序中运行它们。

但是我观察到了我从

回来的对象
IApplicationContext ctx = ContextRegistry.GetContext();
MyObject obj = (MyObject) ctx.GetObject ("MyObject");

不像我预期的那样是一个新对象,因为它“记住”了之前请求中的值。

更糟糕的是,我现在怀疑这个共享实例是跨越APPLICATION,并且由于Web请求的多线程特性,当我的命令执行并写入数据库时​​,这可能会导致混合从多个请求中编写的详细信息。

我的恐惧是否已经建立,是否有一个转变,总是让我回到一个清新干净的新对象而不是共享对象?我觉得我仍然可以在我的网络应用程序中使用Spring IOC。

2 个答案:

答案 0 :(得分:3)

Spring.NET Web应用程序支持对象定义元素中的附加属性,允许您控制对象的范围:

<object id="myObject" type="MyType, MyAssembly" scope="application | session | request"/>

请求,会话和应用程序范围仅在您使用Web感知的Spring IApplicationContext实现(例如WebApplicationContext)时可用。

http://www.springframework.net/doc-latest/reference/html/web.html#web-objectscope

答案 1 :(得分:0)

回答我自己的问题,希望其他人会觉得这很有用。

在新的MVC网站中使用Spring.NET,我注意到了一些奇特的行为。我主要使用Spring作为其AOP功能,为此我使用它的IOC来创建命令对象。流程是:

控制器 - &gt; 'create'Command对象:

var ctx = ContextRegistry.GetContext();   var updateContactCommand =(IUpdateCustomerCommand)ctx [“UpdateCustomerCommand”]; 控制器 - &gt;使用新值设置命令对象

控制器 - &gt;执行命令对象,运行审计建议,使用命令详细信息

在数据库中创建审计行

好东西。或者我想。

我的代码只在特定条件下设置特定字段。但是在运行时,我看到数据库始终存储跨事务输入的最后一个值,即使条件不满足也是如此。该命令记住了上一个事务中设置的值!

当然它没有记住这个值,只是当Spring'创建'updateContactCommand时,它只检索了之前创建的一个 - 一个单例。

这对多线程Web应用程序有重大影响!使用相同命令对象的单独请求可能会导致一些非常不良的行为。

Spring.NET的默认行为是创建一个单例,因此必须在对象声明的末尾添加'singleton =“false”',如下所示。但是,因为我使用的是AOP,所以我的对象类型被声明为ProxyFactoryObjects,而此时singleton无效。

答案仍在配置中,并且使用以下内容:

  <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()