2013-02-26 100 views
0

我有一個函數返回從WCF Web服務獲得的實體。我應該如何返回這個實體?我不認爲我可以返回原始對象(來自Web服務),因爲這意味着函數的調用者(來自其他程序集)將被強制引用該Web服務的服務引用(因爲該類是在服務參考),我想我想避免這種情況。而且我也不認爲我可以使用接口,因爲我無法修改WCF實體來實現我的接口。返回從WCF Web服務獲得的對象

另一方面,我需要精確返回原始實體具有的所有屬性,例如。所有屬性都需要存在,並且不需要對任何值或任何屬性名稱和類型進行轉換/調整。

是否更好創建一個新的類,從原始的WCF類複製相同的屬性?我應該如何實現它,創建一個新的對象來複制原始對象的所有值比較好,

return new Foo() { Id = original.Id, Name = original.Name ...等}

或只是獲取設置的方法,如把它包:

public int Id 
{ 
    get { return _original.Id; } 
    set { _original.Id = value; } 
} 

而且知道怎樣來命名新的類,以避免從WCF參考原來的類名歧義?

+0

或者使用類似Automapper的類將一個類轉換爲另一個類? – stephenl 2013-02-26 06:22:53

回答

0

正如您所想的那樣,強制客戶端使用與服務器相同的類型並不是一個好主意。這會不必要地將服務器應用程序架構暴露給客戶端。最好的選擇是使用數據傳輸對象(DTO)。

對於您希望公開給客戶端的每個實體,您可能都有DTO,並且DTO將具有公開該實體的所有必填字段的屬性。如@stephenl所建議的庫,如值注入器(valueinjecter.codeplex.com)或自動映射器,以幫助您將值從一個對象複製到另一個對象。

將DTO放置在單獨的命名空間和程序集中以實現最佳物理解耦。您可以使用YourCompany.YourProduct.Data.Entities的命名空間實體和YourCompany.YourProduct.Data.DTO的DTO的

+0

是真的,甚至認爲他必須返回與WCF返回相同的DTO,最重要的是,因爲包含WCF代理的dll必須在本地可用於他的應用程序工作,客戶端的應用程序將有權訪問所有WCF DTO和合同代理提供的功能。 – user1416420 2013-02-26 07:04:32

0

其實,這取決於你是否是消費者。如果你是消費者,重新使用類型組件是可以的。但是,如果您不控制消費服務,則最好使用具有[DataContract]屬性的DTO對象。