2010-06-23 53 views
1

首先,這是我的第一個Stack Overflow問題,如果我弄錯了,請提前致歉!WCF數據服務如何添加業務邏輯或使用現有的CSLA對象

我正在爲內部使用的CRM數據庫創建服務端點。有幾個應用程序想讀取和寫入這個數據庫,所以公開WCF服務看起來是最好的方法。

我開始使用ORM的實體框架,業務邏輯層的CSLA和用於與客戶端應用程序通信的標準WCF服務。一切都很順利,直到我看了WCF數據服務,並受到可愛的REST界面的誘惑,AJAX客戶端的易用性以及使用新技術的喜悅!

我現在用單個WCF數據服務替換了大部分的WCF服務,它直接公開了實體框架模型,繞過了CSLA層。這對於只讀操作非常適用,但如果沒有某些業務邏輯,我無法執行其他CRUD功能。

我一直在尋找攔截器,我當然可以把企業登錄在那裏,但我實際上想攔截POST /添加操作,將值映射到問題的CSLA BusinessBase類,讓它做所有的驗證和最後保存到數據庫中。我已經嘗試了這一點,雖然CSLA對象按預期工作,但底層WCF數據服務框架也保留了它的版本,因此我在數據庫中獲得了兩個條目。

因此,我有幾個問題:

1)我可以完全攔截變更請求,讓我自己的業務對象處理它然後取消WCF數據服務未拋出異常?

2)是否有更好的/標準的方法來添加業務邏輯層到WCF數據服務棧?到目前爲止,我還沒有找到。

由於提前,

戴夫

回答

1

不幸的是,如果對WCF數據服務的基礎提供的實體框架,你不能做這一切你自己。目前,在這種情況下,我們不支持完全替換部分處理管道。

另一方面,你可能會玩一些技巧。你主要可以在實體框架上做到這一點。最新版本的EF應該讓你重寫SaveChanges調用,這樣你就可以在那裏做任何你想做的事情。所以這個想法應該是你在你自己改變itnerceptor的時候處理Add操作,然後在SaveChanges中你恢復由WCF Data Services創建的改變,並且只提交你的改變攔截器的改變。或者甚至更好,只需在SaveChanges中做所有事情。

可能還有其他一些好玩的技巧可以與EF一起使用,WCF數據服務可能在不知情的情況下使用,但我並非EF專家。

當前的攔截器是將業務邏輯分層到WCF數據服務(適用於包括EF在內的任何提供者)的標準方法。

另一種方法是從REST稍微離開一點。您可以禁止對給定實體集的POST請求(您可以從您的更改攔截器中拋出)並添加服務操作以在您自己的代碼中執行添加。在這種情況下,你可以完全控制,但客戶會更難以工作。