我有一个服务器侧类我可以在客户方通过[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):

  1. 边界是明确的
  2. 服务自主
  3. 服务共享模式和合同,不类的
  4. 兼容性为依据的政策

看看点#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.服务共享模式和合同,不类。"

如果这种违反不关你的事,这是你要做的:

  1. 移动服务和数据合同到一个单独的(便携式)类图书馆。(让我们打电话这会 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] 是施加于背领域,和 到相应的只读财产。

  2. 参考该合同会从你的两个服务应用程序项目(我会打电话给我 SomeService.Web)和从客户项目(地雷是所谓 SomeService.Client).这可能会造成在下列项目依赖项内部方案:

    screenshot highlighting the project dependencies in Solution Explorer

  3. 接下来,当你增加的业务参考你的客户的项目,确保有选项"重用类型"的启用,并确保合同会(SomeService.Contracts)将包括在这个:

    screenshot highlighting the relevant service reference setting

瞧!Visual Studio,而不是产生一个新的 Foo 类型的服务的WSDL架构,将再利用的不可改变的 Foo 类型的合同的组件。

最后一次警告:你已经偏离了服务原则的援引 其他的答案.但尽量不偏离任何进一步。你可能会开始增加(业务)的逻辑数据的合同的类;不。他们应该保持作为近愚蠢的数据传的对象(交互)作为你可以管理。

定义服务合同(接口)使用类实施合同之前。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top