【问题标题】:spring.net transaction attribute works only for methods called from outsidespring.net 事务属性仅适用于从外部调用的方法
【发布时间】:2011-11-03 18:48:48
【问题描述】:

有一个使用 Spring.NET 配置的服务类。 DoWork 完成了应该在两个事务中运行的两个任务。但是 Spring.NET 似乎没有调用任何事务性 AOP 行为。我必须使用 Transaction 属性注释 DoWork() ,但这会将两个任务包装在一个我不想要的事务中。 我该如何解决这个问题?

IMyService service.DoWork();

public class MyServiceImpl : IMyService
{

public DoWork()
{
  Task1();
  Task2();
}

[Transaction(ReadOnly=false)]
protected void Task1()
{
  // do it
}

[Transaction(ReadOnly=false)]
protected void Task2()
{
  // do it
}
}

【问题讨论】:

  • this similar question相关 我一个月前回答了。 A. 的答案是正确的,链接的答案可能会为您提供更多背景信息。

标签: transactions aop spring.net


【解决方案1】:

正如我看到的here,Spring.NET 正在使用基于接口的动态代理来完成其“AOP-ness”。基于接口的代理像decorator pattern 一样工作。 Task1Task2 方法不是接口的一部分,因此 Spring.NET 无法修饰对这些方法的调用,因此无法应用任何行为。

Task1Task2 更改为public 并将其添加到界面中对您的方案也无济于事,因为DoWork 调用this.Task1()this.Task2(),其中this 将代表具体对象,不是 AOP 代理。

您的方案中唯一的解决方案是使用不同的 AOP 技术,或者在运行时使用基于基类的动态代理(我不知道 Spring.NET 是否允许这样做,可以使用 Unity Interception 来完成)或编译时编织(如PostSharp)。

【讨论】:

  • 这是一个解决方案,但不是唯一解决方案。此外,spring.net 似乎支持 1.3.1 版本的基于继承的代理,这可能会有所帮助。
【解决方案2】:

A.他的观察是正确的。

但是,我建议将这两个任务提取到两个单独的类中,这些类被注入到具有DoWork() 例程的类中。

public class MyServiceImpl : IMyService
{
  // use property injection to set Task1 and Task2
  public DoWork()
  {
    Task1.Process();
    Task2.Process();
  }

}

public class Task1
{
  [Transaction(ReadOnly=false)]
  protected void Process()
  {
    // do it
  }
}

public class Task2
{
  [Transaction(ReadOnly=false)]
  protected void Process()
  {
    // do it
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多