暴露出不同的观点

时间:2010-12-21 08:13:07

标签: c# wcf web-services

是否可以给出一个类的不同视图。例如,我有Account类,我想使用WCF公开这些数据。对于不同的方法调用,我希望公开Account类的不同属性。对于特定的调用,我希望仅公开UserName和Password,for 另一个电话,我想暴露电子邮件和地址。我应该写不同的课程或 我可以向客户公开所需的财产

5 个答案:

答案 0 :(得分:2)

如果一个用法是WCF并且另一个用法是您的应用内部的,那么您可以使用[DataMember]适当地注释该类,以便只有所需的属性暴露了。如果您有两个不同的WCF场景,那么我将引入一个新类(或多个类)来表示每组返回数据,可能会添加一个隐式conversion operator(从实体到< em> DTO ),以便您可以:

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

答案 1 :(得分: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; }
  }

答案 2 :(得分:1)

您可以将DataContract与DataMember属性一起使用,但这样您只能生成一个类的序列化视图。您可能希望创建较小的ViewModel类,可能使用AutoMapper来处理所有映射代码。

答案 3 :(得分:1)

如果要公开同一Account类的多个视图,答案是否定的(我知道)。使用默认的DataContractSerializer,您可以控制仅以声明方式呈现给用户的成员。这将允许您以一种方式自定义用户的视图,但不能自定义倍数。

相反,您可以为要显示的每个“视图”创建一个单独的数据协定类(可能需要Account作为构造函数参数)。

答案 4 :(得分:0)

在使用应用域之外托管的任何服务时,始终始终使用邮件类(也称为DTO)。

我在WCF上的所有演示文稿中都有一张幻灯片,其中列出了Message Classes!= Business Classes,但是我发现了更好的解释方法。

这不是星际迷航的人。 You Can't Fax a Cat(一张图片胜过1000字)。