2009-07-23 42 views
0

现在我将以TransactionScope为例。想象一下,WCF中的每个方法都会执行数据库活动,并且您希望每个调用都处于事务中。你可以在每个你的方法中包含一个使用块,并且这可以很好地工作。有没有更简单的方法来包装每个WCF方法的服务与'使用'块?

我想知道是否有更简单的方法在服务而不是方法级别执行此操作?例如Before/After方法调用事件或ServiceBehavior中的某些事件。

现在我特别知道TransactionScope,你可以使用TransactionScopeRequired属性,但如果它不存在,你会怎么做?

回答

1

经过进一步调查,正如马克说,有似乎没有纯粹的WCF的解决方案。

但是,在某些情况下,有一种解决方案可能是可以接受的。

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

如果您的应用程序可以在ASP.NET兼容模式下运行,这意味着您的WCF服务可以包含一个HTTP模块。这可以挂钩到BeginRequest事件中,创建对象并将其存储在HttpContext.Current.Items中。在EndRequest事件上,我们可以检索这个对象,并调用它的Dispose()方法。

+0

如果操作是单向操作,则不幸的是不起作用。 – 2010-01-21 03:22:14

0

那么,在客户端,你不一定总是想把一个调用包装到一个TransactionScope或其他包装器中 - 也许在某个时候,你会希望将两个,三个或更多的调用分组到一个“范围”。

您可以在客户端和服务器端都对WCF进行相当多的扩展 - 但在我看来,这对于您的实际应用程序非常依赖,并且几乎在每次进行此类尝试强制执行任何操作时不是真的有益。

此外,WCF的可扩展性确实是在调用完成之后才开始的 - 所以你可以处理各种场景,但是你恐怕无法真正将外部代码包装到任何类型的范围中。长话短说:我不认为你想要做的事很有意义,而且我认为你甚至可以只用WCF来做 - 你几乎不得不扩展C#语言(在每次方法调用之后添加编译器技巧以执行某些操作以及其他操作)。

马克

2

这种东西也可以通过Aspect Oriented Programming来处理。这使您可以编写可以“挂钩”到您班级的任何/每种方法的代码。

PostSharp是一个用于.Net的AOP库。