2013-02-07 88 views
3

我正在研究MVC模式之後的Spring應用程序,並想知道什麼被認爲是制定可靠服務層的「最佳實踐」。此問題的原因是以下示例情況:將數據傳遞到服務層的最佳實踐

加載用於編輯用戶信息的頁面。提交此表單後,我將其所有數據都收集到一個特定的Command類中,該類僅包含隨後的操作(更新用戶)所需的數據。

我能想到的幾種情況,現在這個信息傳遞給我服務層:

  • 傳遞命令本身:userService.save(命令);
  • 傳遞一個模型類,在controller中獲取:userService.save(user);
  • 傳遞模型類和命令:userService.save(user,command);
  • 傳遞所有的參數分別:userService.save(command.getName(),...)

在我看來將命令傳遞類本身看起來像最優雅的解決方案,我可以先驗證所有自動使用框架的值將它們傳遞給我的服務。我在這裏擔心的是,當我從另一個類(而不是通過我的表單/控制器)調用方法時,我可以用無效數據填充此命令對象,從而導致服務層可能出現錯誤。

你會推薦什麼?爲什麼?

+0

或者服務層信任te層調用它,dosn't不驗證命令,或者不信任它,並且應該驗證它接收到的數據。你只需要清楚地定義每一層的責任。無論你做什麼,你總能夠傳遞無效的數據。進行測試以確保您不會。 –

回答

0

在他的MVC書中,迪諾埃斯波西託建議創建一個「工人」類,它需要並返回一個視圖模型。控制器使用視圖模型調用worker,然後根據需要委託worker。我沒有在實踐中使用它,但理論上它似乎是一個很好的解決方案。

1

看到你我有以下想法 傳遞命令本身:userService.save(command);

這可能不是一個古德主意,因爲你的服務層是不必要的 依賴Command對象

Passing a model class, fetched in the controller: userService.save(user); 

我會投票給本上。服務層只有什麼是真正應該 知道

Passing both a model class and the command: userService.save(user, command); 

號相同第一個選項

Passing all of the parameters individually: userService.save(command.getName(), ...) 

Hmmmm ...不知道...也許是一個維護未來的開銷。

I think if you want to do the validation, Use validation util classes to do the validation 
    which can be used for both Service and UI layer. Here a lot validation can be centralized. 
0

使用Command對象會引起麻煩的任何選項。它打破了鬆耦合。現在您的服務層與服務層緊密結合。請不要這樣做。(編輯:在我下面的答案,當我說表示層模型我說的是視圖模型和服務層它是域模型) 發送您的模型對象看起來像一個不錯的選擇。但是,這取決於模型的創建方式。有時候,表示層需要一個不同的模型結構,而服務層需要一個moderatley /完全不同的結構。

如果兩個圖層都有不同的需求,則需要創建2個模型結構。當表示層發生變化時,這種服務層的模型結構不需要改變。這很重要,因爲該服務可能有多個消費者,並且在表示層更改時可能無法更改。

如果它們沒有不同的結構,我仍然會從服務層的角度創建它們,因爲服務是真正的可重用組件。

0

在處理多層系統中的命令時要遵循的一個很好的模式是使用CommandBus服務將命令路由到其特定處理程序。這樣,你可以將你的控制器與你的服務分開(同時與通用路由系統相連)。

commandBus.handle(command);

你必須做額外的工作在配置命令總線處理器,但它會在長期內支付當你將能夠重複使用的路由信息​​:

commandBus.register(commandType, handlerService);

然後您可以移動commandBus服務中的命令驗證(即使這將意味着對commandBus的一些擔憂)

commandBus.registerValidator(commandType, validatorsCollection);

相關問題