代码之家  ›  专栏  ›  技术社区  ›  MattH

有没有一种更简单的方法可以用“using”块包装服务中的每个wcf方法?

  •  0
  • MattH  · 技术社区  · 16 年前

    我现在以TransactionScope为例。假设WCF中的每个方法都执行数据库活动,并且您希望每个调用都在事务中。您可以在每个方法中都包含一个using块,这很好。

    我想知道是否有一种更简单的方法可以在服务级别而不是方法级别实现这一点?例如,方法调用事件之前/之后,或者ServiceBehavior中的某个事件。

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Sean Carpenter    16 年前

    这种事情也可以由 Aspect Oriented Programming . 这允许您编写可以“钩住”到类的任何/每个方法中的代码。

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

        2
  •  1
  •   MattH    16 年前

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

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

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    

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

        3
  •  0
  •   marc_s    16 年前

    在客户机上,您不一定总是希望只将一个调用包装到TransactionScope或其他包装器中——也许在某个时刻,您希望将两个、三个或更多调用组合到一个“范围”中。

    您可以在客户端和服务器端扩展WCF,但在我看来,这是一个非常依赖于您的实际应用程序的东西,而且几乎每次您进行这样的调用时,试图强制执行任何操作都不会真正有益。

    此外,当调用完成后,WCF扩展性就真正开始了——所以您可以处理各种情况,但恐怕您不能真正将外部代码包装到任何类型的范围中。

    长话短说:我不认为你想做的是很有意义的,而且我认为你甚至不能只用wcf来做这件事——你几乎必须扩展C语言(在每个方法调用之前和之后添加编译器技巧来做一些事情)。

    马克

    推荐文章