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