0

我正在使用 Spring.NET 创建我的 Command 对象(带有附加的 Advice)并在 MVC Web 应用程序中运行这些对象。

但是我观察到我回来的对象

IApplicationContext ctx = ContextRegistry.GetContext();
MyObject obj = (MyObject) ctx.GetObject ("MyObject");

正如我所料,它不是一个新对象,因为它已经“记住”了先前请求中的值。

更糟糕的是,我现在怀疑这个共享实例是跨应用程序的,并且由于 Web 请求的多线程性质,当我的命令执行并写入数据库时​​,这可能会导致写入的详细信息混杂在一起来自多个请求。

我的恐惧是否成立,是否有一个开关可以让我始终获得一个全新的、干净的新对象而不是共享对象?我觉得我应该仍然可以在我的 Web 应用程序中使用 Spring IOC。

4

2 回答 2

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

于 2012-08-23T07:21:43.817 回答
0

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

在一个新的 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 ()

于 2012-08-22T14:18:30.120 回答