2010-04-15 136 views
2

我必須使用一些不是真正MVC的代碼(即,它不使用顯式框架等)。現在我們做一些將數據傳遞給服務的servlet。MVC實現/最佳實踐問題

這是我的問題。我正在收到一個包含大量地址數據的servlet的文章,我必須將其保存到數據庫中。數據顯然在HttpServletRequest對象中。我的問題是,我如何將這些數據傳遞給服務?我不願意這樣做:

AddressService.saveAddress(request); 

因爲我不認爲服務應該有一個依賴於請求。我的另一種選擇是做這樣的事情:

String addressLine = request.getParameter("addressLine"); 
.. 
.. about 7 other parameters 
.. 
String zip = request.getParameter("zip"); 

AddressService.saveAddress(addressLine, ... 7 other parameters ..., zip); 

,但我不喜歡用的參數數量龐大的功能無論是。我正在考慮創建一個名爲AddressData的中間對象,該對象將保存請求中的數據,然後將其傳遞到服務中。這是一種可以接受的做事方式嗎?

回答

2

是的,這是消除這種依賴性的已知方法。我無法從頭腦中回想起確切的來源,但有幾本書包含了這種技術。

這樣做的一個變種是使AddressData成爲一個包裝,它不是自己複製和保存所有需要的請求數據,而只是保留一個私人引用,並將所有調用轉發給它。這可能更靈活和更清潔,特別是如果有許多請求參數和/或參數改變/新頻繁引入。

1

使用接口脫鉤:

型號:

public interface Address { 
    String getLine1(); 
    String getLine2(); 
    ... 
    String getZip(); 
} 
public class AddressBase implements Address { 
    public AddressBase(String line1, String line2, ..., String zip) { 
     ... 
    } 
    ... 
} 
public class AddressService { 
    void saveAddress(Address address); 
} 

現在控制器(S)有自己的選擇和模型由控制器執行保護:

控制器選項1:

// wrap - lazy interrogator 
class AddressRequestWrapper implements Address { 
    ... 
    AddressRequestWrapper(HttpRequest request) { 
     this.request = request; 
    } 
    String getLine1() { return request.get(LINE_1_FIELD_ID); } 
    ... 
} 

控制器選項2:

// "wrap" - eager interrogator 
class AddressRequestWrapper extends AddressBase { 
    AddressRequestWrapper(HttpRequest request) { 
     super(
      request.get(LINE_1_FIELD_ID), 
      request.get(LINE_2_FIELD_ID), 
      ... 
      request.get(ZIP_FIELD_ID) 
     ); 
    } 
    ... 
} 

控制器選項3:

// Just use AddressBase directly 
Address address = 
    new AddressBase(
      request.get(LINE_1_FIELD_ID), 
      request.get(LINE_2_FIELD_ID), 
      ... 
      request.get(ZIP_FIELD_ID) 
    ); 
AddressService.saveAddress(address);