现在已经到了 WCF 地狱的第 74 级,我被判处永远的 DTO 混乱。我非常习惯于像这样明智地封装对象/属性设置机制,其中在构造函数中设置了一些默认值,并且该值的重置“弄脏”了对象:
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
andDataMember
装饰器。当我单步执行时,我看到堆栈中有一些我无法进入的调用,但这大致是结果:
[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;
}
}
我可以看到构造函数参数的值流入set
,但我不知道如何,也看不到如何将 mapper-constructed-default 值与 user-edited-property-value-and-now 分开-it-must-be-returned-to-the-service 编辑。
我确定这是对 DTO 的滥用,但我看不到正确的 WCF 方法来处理这些非常基本的常见情况:
- 您如何将属性值的实例化与对其的编辑分开?
- 如果您有一个具有 50 个属性的对象/DTO,您如何知道用户何时更改了其中的 49 个属性,以及如何将这些更改一次性发送回 BLL 母对象船?