使用DTO,更新WCF中BLL属性的正确方法是什么?

使用DTO,更新WCF中BLL属性的正确方法是什么?,wcf,events,c#-4.0,properties,dto,Wcf,Events,C# 4.0,Properties,Dto,现在我已经到达了WCF地狱的第74级,在那里我被判处永远的混乱。我很习惯这样一种明智的封装对象/属性设置机制,在构造函数中设置一些默认值,重置该值会使对象脏掉: public class SomeObject { private int someValue; public int SomeValue { get { return someValue; } set { someValue = va

现在我已经到达了WCF地狱的第74级,在那里我被判处永远的混乱。我很习惯这样一种明智的封装对象/属性设置机制,在构造函数中设置一些默认值,重置该值会使对象脏掉:

public class SomeObject
{
    private int someValue;

    public int SomeValue
    {
        get { return someValue; }
        set 
        { 
            someValue = value; 
            // now SomeObject.IsDirty = true;
        }
    }

    public SomeObject(int someDefaultValue)
    {
        someValue = someDefaultValue;
    }
}
DTO似乎强烈反对这个简单的构造,我假设,但不知道通过DataContract和DataMember装饰器。当我逐步完成时,我在堆栈中看到一些我无法进入的调用,但这大致就是结果:

[DataContract]
public class SomeObjectDTO
{
    private int someValue;

    [DataMember]
    public int SomeValue
    {
        get { return someValue; }
        set
        {
            // apparently the set is getting called by the constructor?
            someValue = value;
        }
    }

    public SomeObjectDTO(int someDefaultValue)
    {
        //apparently no one cares what I want to do here? next line won't fire
        someValue = someDefaultValue;
    }
}
我可以看到构造函数参数的值流入集合,但我不知道如何,也不知道如何将映射器构造的默认值与用户编辑的属性值分开,现在必须将其返回到服务编辑

我确信这是对DTO的滥用,但我看不到正确的WCF方法来处理这些非常基本、常见的情况:

如何将属性值的实例化与 编辑它? 如果你有一个对象/DTO,比如说,有50个属性,你如何知道用户何时更改了其中的49个属性,以及如何在一次快照中将这些更改发送回BLL母对象发货?
在这个问题上缺乏回应可能与我的提问不够清晰有关,但它的要点对WCF初学者很重要,我怀疑这里很少有WCF的权威机构,所以。。。不管怎样,我现在可以自己回答了,以防有人被困在我一个月前的地方

如果您单步执行使用WCF的WCF操作,很容易误解正在发生的事情,除非您仔细观察调用堆栈。有些SomeObjectD可以在服务器端正确构造,您可能认为调用已经完成。。。只看到它再次穿过。我想MSFT没有办法记录这一点,但是第二个构造将忽略任何使用参数的构造函数,实际上是反序列化。对于DataContract初学者,我再怎么强调也不为过:您将根据服务端的一些规则构造对象,然后除非您已经实现了自己的序列化程序,否则它将被100%地序列化和反序列化,这将在客户端导致新的无参数构造,这意味着您只能使用set方法来构造它。这是因为它不是被构造的,它是被重建的,或者,正如一些人所说,是从一系列关于它自身的元数据中重新水化的。它只是在父元素下串在一起的属性

因此,对于一些IsDirty逻辑被构建到DataMember中的问题,请忘记它。对象是传输机制,一次性的,只和可以序列化的一样智能,这很愚蠢:一个名称-值对列表。知道50个属性中有1个已更改或未更改的唯一方法。。。就是在一些更智能、至少是半持久化的环境中比较对象之间的值:是这样吗?不,不是吗?哦,太脏了。乘以50。或者1000。或者不管有多少


所有这些都很搞笑,因为WCF中实现的SOA和解耦代表了发展的巨大飞跃。他们没有;它们代表的是一种非常弱的共识,一种最低公分母的方法,当将其旋转到单个应用程序级别时,需要大量的复制工作。最佳情况场景,即复制被扩展到模型、操作和协议的联合故障排除;在最坏的情况下,您将编写n个版本的代码来处理n种情况。这在.NET到.NET的实现中变得非常明显,因此更加痛苦,如果.NET是您的平台,而MSFT堆栈是您的环境,那么这是一个强烈反对使用WCF的理由。再加上无数个隐藏的配置默认值,等待在没有准确异常报告的情况下炸毁一个操作,您可以将其称为一天,或者比您当前的范围多出三到四个人月。

您的操作契约上是否使用了DTO?是的,这就是创建DTO的全部目的。