WCF:暴露只读数据成员性质没有设置?
-
18-09-2019 - |
题
我有一个服务器侧类我可以在客户方通过[DataContract].这类有一个只读的领域,其中我想可以通过一种财产。然而,我无法这样做,因为它似乎没我允许添加一个[数据成员]财产不具有获得和设置。
这么-是有一个办法有一个[数据成员]的财产没有设置器?
[DataContract]
class SomeClass
{
private readonly int _id;
public SomeClass() { .. }
[DataMember]
public int Id { get { return _id; } }
[DataMember]
public string SomeString { get; set; }
}
或将溶液可使用[数据成员]作领域(例如:示 在这里,)?试图这样做过,但它似乎并不关心的领域是只读的..?
编辑:是唯一的方式作一个只读财产的黑客提出这样的?(没有-我不想要做这个...)
[DataMember]
public int Id
{
get { return _id; }
private set { /* NOOP */ }
}
解决方案
你的"服务器的端"类不会"提供"客户,真的。
会发生什么情况是这样的:根据该数据合同,该客户将创建一个新的单独的类从XML模式的服务。它的 不能 使用该服务器的端类本身!
它将重新创建一个新的类从XML模式的定义,但这一架构不包含任何的。净具体的事情像可见或访问剂-它只是一个XML模式。客户侧类将是建立在这样一种方式,它具有同样的"足迹"线上-例如它将成相同的XML格式。
你的 不能 "运输"。净具体的知识有关的类,通过标准的肥皂基于服务之后,所有你穿四周都是 化的消息 -没有类!
检查"四个原则的SOA"(定义为由不框Microsoft):
- 边界是明确的
- 服务自主
- 服务共享模式和合同,不类的
- 兼容性为依据的政策
看看点#3-分享服务模式和合同, 不 类-你永远只能分享口和XML模式的数据合同这一切-没有。网课程。
其他提示
把数据成员属性在字段不是属性。
记住吧,让WCF不知道封装。封装是OOP术语,而不是SOA术语
这是说,请记住,现场将使用你的类是只读的人 - 使用该服务的任何人都将有充分的机会到外地就在自己身边。
我在一个类中的一些性质在我的服务层我想传递过来的Silverlight。我并不想创造一个全新的类。
不是真的“推荐”,但这似乎两害中的较小者的Total
属性过到的Silverlight(仅用于视觉数据绑定)。
public class PricingSummary
{
public int TotalItemCount { get; set; } // doesnt ideally belong here but used by top bar when out of store area
public decimal SubTotal { get; set; }
public decimal? Taxes { get; set; }
public decimal Discount { get; set; }
public decimal? ShippingTotal { get; set; }
public decimal Total
{
get
{
return + SubTotal
+ (ShippingTotal ?? 0)
+ (Taxes ?? 0)
- Discount;
}
set
{
throw new ApplicationException("Cannot be set");
}
}
}
有一种方法来实现这一点。但是警告说,它直接违反了以下原则中引用的 这个答案:
"3.服务共享模式和合同,不类。"
如果这种违反不关你的事,这是你要做的:
移动服务和数据合同到一个单独的(便携式)类图书馆。(让我们打电话这会
SomeService.Contracts
.) 这是你如何定义不可改变的[DataContract]
级:namespace SomeService.Contracts { [DataContract] public sealed class Foo { public Foo(int x) { this.x = x; } public int X { get { return x; } } [DataMember] // NB: applied to the backing field, not to the property! private readonly int x; } }
注意,
[DataMember]
是施加于背领域,和 不 到相应的只读财产。参考该合同会从你的两个服务应用程序项目(我会打电话给我
SomeService.Web
)和从客户项目(地雷是所谓SomeService.Client
).这可能会造成在下列项目依赖项内部方案:接下来,当你增加的业务参考你的客户的项目,确保有选项"重用类型"的启用,并确保合同会(
SomeService.Contracts
)将包括在这个:
瞧!Visual Studio,而不是产生一个新的 Foo
类型的服务的WSDL架构,将再利用的不可改变的 Foo
类型的合同的组件。
最后一次警告:你已经偏离了服务原则的援引 其他的答案.但尽量不偏离任何进一步。你可能会开始增加(业务)的逻辑数据的合同的类;不。他们应该保持作为近愚蠢的数据传的对象(交互)作为你可以管理。
定义服务合同(接口)使用类实施合同之前。