2013-07-10 38 views
0

我正在執行Core J2EE Patterns中指定的DAO模式。在我的項目中,我有3個模塊:core layer,它使用DAO-API layer,這由我的Service ProviderDAO-MySQL layer執行。在Java中實現DAO模式時,應該如何實現和使用TransferObjects?

我對設計和使用的TransferObject的提問:

1A)是正常的,有TransferObject,希望能非常多餘的,因爲相比,他們相當於「業務層」類或「業務層」類TransferObject s?

舉例來說,如果在我的core layer我有一個類:

public class Customer { 
    private int id; 
    private String lname; 
    ... 
    //various methods here, plus getters/setters 
} 

DAO-API layer,我將有:

public class CustomerTO implements Serializable { 
    private int id; 
    private String lname; 
    .... 
    //getters/setters here 
} 

我恨CustomerCustomerTO之間的冗餘。此外,在Core J2EE Patterns的「示例9.5客戶傳輸對象」中,似乎只有一個Customer類,即TransferObject

我還看到有兩個類允許我的DAO-API layer完全獨立於core layer,並作爲單獨的模塊提供,最終用戶甚至不知道。

=>1B)但也許我DAO-API layer應該是我core layer的一部分,並且CustomerTransferObject

=>1c)或者是有什麼我錯過,以避免核心業務層類和它的傳輸對象之間的冗餘?



2)調用DAO的方法時,它是合法的,以使用TransferObject S作爲參數?例如:

public interface CustomerDAO { 
    public Collection<CustomerTO> getCustomersByNameAndCity(String name, String city); 
} 

或者我應該使用類似:

public interface CustomerDAO { 
    public Collection<CustomerTO> getCustomersByNameAndCity(CustomerTO to); 
} 

什麼是使用第一種方法的缺點?

回答

0

1a)是否正常具有TransferObject 是的,在您不試圖限制DTO中的信息跨越發送的情況下是正常的。數據傳輸對象是用於封裝數據的對象,並且將其從一個應用程序的一個子系統發送到另一個。

1b)但是,也許我的DAO-API層應該是我的核心層的一部分,而Customer是TransferObject?不,DAO層是隱藏/封裝數據庫中數據的底層細節。其他子系統使用DAO從數據源獲取數據,而不考慮其存儲/讀取方式。 DAO的主要目的是提供簡單的API來對數據執行CRUD。

1c)或者是有什麼我想念,以避免核心業務層類和它的傳輸對象之間的冗餘? 如果您的DTO不限制任何信息,那麼您可以使用業務層中的同一個類。但是當您必須限制信息時,它可能會在未來的增強中造成問題。

2)調用DAO方法時,不使用TransferObjects作爲參數是否合法?例如 沒有人能阻止你這樣做。但有時DTO的屬性和DAO屬性可能不容易轉換到對方。所以你必須爲它添加額外的邏輯。這應該由中間人,你的業務層來照顧。

+0

「如果您的DTO不限制任何信息,那麼您可以在業務層使用同一個類,但是當您必須限制信息時,它可能會在未來的增強中導致問題。」 =>在哪些情況下我會希望DTO限制某些信息?我沒有看到任何用例。此外,最常用的解決方案是「複製」DTO,還是直接使用業務層類? – FBB