Windows服务中的尖锐架构contrib事务属性

时间:2013-09-08 18:23:00

标签: nhibernate s#arp-architecture

出于某种原因:

[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");

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

编辑:

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