我已经实现了一些组件以将 WCF 与 IoC 容器 (StructureMap) 和每次调用的会话模式一起使用。NHibernate 的东西大部分来自这里:http ://realfiction.net/Content/Entry/133 。
似乎没问题,但我想在每次调用时打开一个事务并在最后提交,而不仅仅是 Flush() ,它在文章中是如何完成的。
这是我遇到一些问题的地方,可以使用一些建议。我还没有找到回滚的好方法。我意识到我可以检查 CommunicationState,如果有异常,回滚,如下所示:
public void Detach(InstanceContext owner)
{
if (Session != null)
{
try
{
if(owner.State == CommunicationState.Faulted)
RollbackTransaction();
else
CommitTransaction();
}
finally
{
Session.Dispose();
}
}
}
void CommitTransaction()
{
if(Session.Transaction != null && Session.Transaction.IsActive)
Session.Transaction.Commit();
}
void RollbackTransaction()
{
if (Session.Transaction != null && Session.Transaction.IsActive)
Session.Transaction.Rollback();
}
但是,我几乎从不从服务调用中返回故障状态。我通常会处理异常并在我的响应对象上返回一个适当的指示器并自己回滚事务。
我能想到的唯一处理方法是不仅将存储库注入我的 WCF 服务,还注入一个 ISession,这样我就可以回滚并以我想要的方式处理。这对我来说并不好,而且似乎有点漏水。
还有其他人处理同样的问题吗?