0

出于某种原因:

[Transaction]
public void DoSomething()
{
    ...
}

不起作用我仍然必须像这样显式使用事务:

public void DoSomething()
{
    using (var tx = NHibernateSession.Current.BeginTransaction())
    {
        ....
        tx.Commit();
    }
}

任何想法为什么?

我正在使用这样的东西来引导东西:

_container = new WindsorContainer();
ComponentRegistrar.AddComponentsTo(_container);

...

ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(_container));

ComponentRegistrar.AddComponentsTo(_container, typeof(NHibernateTransactionManager));

NHibernateSession.Init(new ThreadSessionStorage(),
        new[] { "Bla.Domain.dll" },
        new AutoPersistenceModelGenerator().Generate(),
        "NHibernate.config");
4

2 回答 2

1

正如 Doan 所说,拥有该方法的组件没有被代理。

由于该方法不是虚拟的,我假设您的类正在实现一个接口。确保您在调用 DoSomething 的类中具有定义为接口而不是实现类的依赖项。

如果您调试代码,并检查对象的运行时类型,它应该是城堡代理

有关更多详细信息,请查看 Sharp Architecture contrib wiki https://github.com/sharparchitecture/Sharp-Architecture-Contrib/wiki/Troubleshooting上的故障排除部分

于 2013-09-22T23:59:57.223 回答
0

通常,此类问题是由于调用提供事务管理服务的动态代理失败引起的。两个最常见的错误是:

  • 方法不能被代理:很可能没有实现任何接口方法,或者对象没有被代理。
  • 该方法是从同一个类调用的,它绕过了所有代理。

编辑:

我猜你使用 Castle Windsor 作为 IoC 容器。[Transaction]装饰需要自动交易管理工具才能工作。如果您成功配置了该工具,即您使用[Transaction]一种方法而不是其他方法进行工作,则上述答案适用。如果所有的事务修饰都失败了,那么你必须首先检查设施的配置。

于 2013-09-17T04:56:09.163 回答