2009-07-23 47 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庫。

相關問題