2010-12-21 48 views
1

是否可以給出不同類別的視圖。例如,我有帳戶類,我想公開這個數據使用WCF。對於不同的方法調用,我希望公開不同的帳戶類的屬性。假設特定的調用我想只公開用戶名和密碼,爲 另一個電話我想公開電子郵件和地址。如果我必須寫不同的類或 我可以在需要的財產暴露在客戶端公開類別的不同視圖

+0

爲什麼要調用某些方法時隱藏某些屬性?它是將它從程序員還是用戶中隱藏起來? – Heki 2010-12-21 08:16:06

+0

@Heki - 從提及[wcf]和[web-services],我們應該推斷a **客戶端**所需的數據不一定與系統內部需要的數據相同。 – 2010-12-21 08:24:10

+0

你可能是對的,但我覺得有必要提出一個澄清的問題。無論如何,我一定會像你所建議的那樣與DTO合作。 – Heki 2010-12-21 09:04:28

回答

1

你可以做到這一點使用接口「意見」。例如,使用方法或屬性創建一個UsernamePassword接口來訪問用戶名和密碼,並讓Account類實現這個接口。然後你可以傳遞這個接口,並且它的用戶不會意識到帳戶類中的其他方法和屬性。

interface IUsernamePassword 
    { 
    string Username { get; set; } 
    string Password { get; set; } 
    } 

    class Account : IUsernamePassword 
    { 
    public string Username { get; set; } 

    public string Password { get; set; } 
    } 
+0

注意這裏也有WCF,它可以影響事物;此外,調用者可能拋棄界面也可能無關緊要。 – 2010-12-21 08:18:56

1

您可以使用具有DataMember屬性的DataContract,但它允許您只生成一個類的序列化視圖。您可能需要創建較小的ViewModel類,可能使用AutoMapper爲您處理所有映射代碼。

2

如果一個用法是WCF和另一使用內置於您的應用程序,那麼你就可以適當地[DataMember]使得只有期望的特性暴露註釋類。如果您有兩個不同的WCF場景,那麼我會引入一個新的類(或多個類)來表示每組返回數據,可能會添加一個隱含的conversion operator(從實體DTO),以便您可以執行:

public CustomerLite GetCustomer(int id) { 
    Customer cust = SomeTier.GetCustomer(id); 
    return cust; // note cust is Customer but we are returning CustomerLite 
} 
1

如果要公開同Account類的多個視圖,答案是否定的(即我所知道的)。使用默認的DataContractSerializer,您可以控制哪些成員僅以聲明方式呈現給用戶。這將允許您以一種方式自定義用戶的視圖,但不能以倍數。

相反,您可以創建一個單獨的數據合同類(可能需要Account作爲構造函數參數),以便爲每個您希望公開的「視圖」創建。

0

永遠,永遠,使用被你的應用程序域之外的任何託管服務時,總是使用消息類(又名DTO)。

我用在我的WCF所有演示,說明郵件類別!=業務類幻燈片,但我既然找到了一個更好的方式來解釋它。

這不是星際旅行的人。 You Can't Fax a Cat(一張圖片勝過1000字)。