我正在使用WCF数据服务来提供OData端点作为我服务的一部分。最近我要求向其中一个成员添加一个属性,但我不希望这个作为服务的一部分返回。
我首先使用代码,我的实体类似于:
[DataServiceEntity]
public class Customer
{
[Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int customer_id { get; set; }
[Required]
public string customer_name { get; set; }
public int customer_hidden { get; set; }
}
上面的类是我的DbContext的一部分,它由DataService使用 - 所以是一个基本的实现。
有没有办法阻止使用某些DataAnnotation将customer_hidden返回给客户端?
答案 0 :(得分:0)
我建议您不要在数据层和服务层中使用相同的对象,因为它会在服务器和客户端之间建立紧密耦合。
我在你的问题中证明了这一点,我想:你想要一个服务器端的标志,说客户是隐藏的,客户端不应该访问的信息。
相反,您可以在服务层(在WCF服务接口方法中)使用DTO's,它只是不包含此属性,例如。
public class CustomerDto
{
public int customer_id { get; set; }
public string customer_name { get; set; }
}
您需要在实体对象和DTO之间进行某种映射,但是有很好的第三方库可以为您处理。我使用Automapper。
通过这种方法获得的松散耦合为您提供了一系列优势。例如,考虑在服务器端扩展或更改客户对象并添加地址数据,电话号码等。或者将 customer_id 重命名为 CustomerId 。所有这些更新都可以通过这种方法从客户端隐藏,您只需保留映射(如果添加了字段)或略微更改映射(如果是重命名的字段)。
然后,当客户端也已更新为支持新功能时,您可以扩展服务层以包含新属性。
如果您想全程采用这种方法,您还应该考虑将DTO映射回专用于客户端的客户端(GUI)实体。最近我需要在客户端对象上有一个标志,指示对象是否已被打印。这种标志在服务层或服务器上没有位置,但由于我创建了客户端对象,因此没有问题。
这种方法的一个缺点可能是您忘记在服务层中添加的属性在客户端出现 null ,但根据我的经验,这些类型的错误很容易被追踪。