2009-12-02 45 views
7

我們正在使用WSSF構建WCF Web服務。這個想法是,它會通過服務暴露我們的主數據庫,並允許我們在服務之上構建各種應用程序和網站。目前,我正在構建一個簡單的客戶端應用程序,該應用程序將從該服務下載一些數據,對其進行處理,然後將其作爲報告CSV文件提供給用戶。WCF /客戶端應用程序 - 業務邏輯應該去哪裏?

現在的問題是業務邏輯(操縱數據)應該放在哪裏?我想我會把它放在服務裏面。我已經有了一個業務層,其中包含幾乎與數據庫一一對應的簡單對象(客戶,訂單等)。我認爲我會製作一些「更高級別」的對象來操縱數據。例如,通過使用客戶,訂單和其他對象並生成報告等。我認爲最好的地方在於服務的業務層。這樣,如果需要,我們可以將這個邏輯用於各種不同的應用程序。

不幸的是,我的老闆不同意。他希望有一個「關注點分離」,並說這個邏輯的正確位置應該位於客戶端應用程序內的業務層,而不是服務中。我想這可能會更簡單,但我想在服務業務層中使用強大的對象模型編寫此代碼。服務公開的對象不是「真實」的對象,實際上只是輕量級的數據結構,沒有服務業務層中存在的完整對象模型的能力。

你們認爲什麼?非常感謝您的幫助。

乾杯 馬克

+4

問他:如果我們需要另一個客戶端,我們應該複製所有的業務邏輯,還是使用集中版本? – 2009-12-02 01:58:15

+2

繼續使用@Rubens Farias的邏輯,如果業務邏輯需要修復並駐留在客戶端,那麼*所有*客戶端需要更新。如果它在服務中,那麼只有服務需要更新。 – 2009-12-02 02:37:10

+0

感謝您的回覆。是的,我也認爲可重用性很酷。我想主要的缺點是更新服務可能會破壞所有現有客戶端。 – 2009-12-02 04:15:25

回答

0

我認爲什麼是「正確的」取決於你的應用程序體系結構。分離關注確實是有價值的。這聽起來像你的老闆認爲當前的模型是使用服務器作爲數據訪問層,將數據庫映射到業務對象,業務邏輯應該在客戶端上實現。

無論業務邏輯是在客戶端還是服務器上實現,您仍然可以分離關注點。這不是你處理重要的地方,而是你設計應用程序層之間接口的方式。

這可能有助於更多地瞭解客戶。你在處理瀏覽器/ Javascript客戶端嗎?如果是這樣,那麼我會盡可能在服務器上進行儘可能多的處理,並以您希望顯示的形式或多或少地向客戶端發送數據。

如果它是一個C#客戶端,那麼在這方面你有更多的權力來處理。您可能可以將WCF服務的響應重構爲您在服務器端使用的相同業務對象類,並獲得與服務器上相同的權力。 (只是在兩個解決方案之間共享業務對象類)。

+0

感謝您的評論。將有2個客戶端組件用於WCF Web服務的特定用途。一個Asp.NET Web應用程序,也是一個.NET Windows服務。這意味着客戶端不缺電。 實際上,在我看來,您不能在WCF Web服務中公開標準業務對象(使用Save()和按需加載的屬性等方法)。它公開的對象是稱爲「數據契約」的簡單數據結構。 – 2009-12-02 04:24:13

+0

DataContract/DataMember實質上只是對象的一個​​接口,它決定了它如何通過網絡發送。你仍然可以將各種方法放在那裏。方法本身不會通過Web服務請求發送,但只要兩個應用程序都使用相同的業務對象庫,它們就會作爲類定義的一部分存在於兩端。很顯然,像Save()這樣的操作只能發生在一端或另一端(Save()必須發生在服務器上)。另一方面,客戶端可以有一個調用服務保存方法的ClientSave()方法。 – 2009-12-02 18:54:01

+0

內特很有意思。我沒有考慮過這種可能性。我認爲將業務對象保留在業務層等內可能會更好。儘管這是一種從數據層對象轉換爲業務層對象到服務層對象的痛苦...... – 2009-12-03 04:16:10

0

對此沒有硬性規定,但在這種情況下,我會說你的老闆比你更爲錯誤:)每個人都會有一些不同對此的看法,並且可能有多種原因將您的業務邏輯放在業務層以外的其他位置,但很少有理由將其放入客戶端應用程序中 - 您可以爭辯說,當它位於客戶端中時應用程序,那麼它是一個UI或演示規則,而不是業務規則。

如果web服務將被許多應用程序使用,那麼儘可能多的你需要Web服務端的業務邏輯。我實際上有一個非常瘦的webservice層,它所做的只是接受調用,然後將執行傳遞給實際的業務層。我還會在數據庫層中完成數據庫數據和業務數據實體之間的映射,而不是業務層。

+0

Hi Slugster 是的,這就是我的架構使用。數據層是ADO實體框架,我有一個業務層,其中包含使用實體框架對象填充的對象。該圖層包含大部分代碼。 WCF Web服務層使用WSSF(Web服務軟件工廠)構建。該層僅將業務對象轉換爲WCF消息。 – 2009-12-02 04:20:01

7

我的投票將是明確的:

  • 把儘可能多的數據完整性檢查到數據庫
  • 放任何其他業務邏輯檢查到業務邏輯層上的服務的服務器端
  • 只需將「所需字段」等簡單檢查放入客戶端層,根據數據庫模型或您的商業模式最佳自動確定

爲什麼要數據庫?
任何形狀或形式的SQL都有一些非常基本和非常強大的檢查功能 - 確保東西是唯一的,確保表之間的關係完整性是給定的等等 - USE IT!如果您在數據庫中執行這些檢查,那麼無論您的用戶如何最終連接到您的數據(恐怖場景:管理員能夠使用Excel直接連接到您的表格以執行一些商業智能工作......),那些支票將到位並將執行。強化數據完整性是任何系統的最大要求。

爲什麼服務器上的業務邏輯?
其他答覆者提到的原因相同:集中。您不希望僅在客戶端擁有業務邏輯和支票。如果貴公司的其他部門或第三方外部顧問突然開始使用您的服務,但所有驗證和業務檢查都不到位,因爲他們不知道他們?不是一件好事......

邏輯在客戶端
是的,當然 - 你也想放一些簡單的檢查到客戶端,尤其是如果它是一個Web應用程序。像「此字段是必需的」或「此字段的最大長度」等事情應該儘早實施。理想情況下,這將由客戶端從數據庫/服務層自動獲取。 ASP.NET服務器控件具有可以自動打開的客戶端驗證,Silverlight RIA Services可以在後端數據模型中獲取數據限制並將它們傳輸到客戶端層。

+1

感謝您的詳細回覆Marc。我當然同意你的所有評論!我想我談論的那種邏輯是將來自多個地方的數據彙總到某種報告或導出文件中。這並不是檢查完整性等。然而,從你的評論和其他人看來,大多數開發人員也會把這種事情放在服務業務層。如果我可以訪問這一層的全面業務對象,而不是服務公開的輕量級數據合同,開發起來也會容易得多。 乾杯 馬克 – 2009-12-02 06:35:06

+0

+1與警告。是否存在可能性(很快會擔心現在)您的客戶可能會多樣化,即​​客戶需要略微不同的邏輯,第三方使用您的服務或更廣泛的用途。 在這種情況下,單個集中式BLL最終可能擁有大量的控制邏輯來確定爲每個客戶做些什麼。 好吧,所以在服務層中引入一層抽象可以幫助並且通常可以做到這一點。 沒有理由不能在邏輯上分離關注點,而是在身體/實施方面明智地將它們放在一起。 蛋糕和吃它? – MattC 2009-12-02 08:19:03

+0

@MATC:是的,如果你需要支持多個客戶端,你的需求可能會分開。但我仍然認爲,即使在服務器上有三組,五組不同的驗證規則,也比擁有數十或數百個客戶端更新更容易。 – 2009-12-02 09:20:23

相關問題