2010-12-21 70 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字)。