เมื่อใดก็ตามที่ฉันใช้ WCF ฉันมักจะพยายามสร้างคลาสที่ไม่เปลี่ยนรูปแบบซึ่งจบลงด้วยการข้ามสาย (เช่น พารามิเตอร์ที่ตั้งค่าในตัวสร้าง คุณสมบัติเป็นแบบอ่านอย่างเดียว) อย่างไรก็ตาม สิ่งนี้ขัดขวางการทำซีเรียลไลซ์ WCF ซึ่งต้องการให้คุณสมบัติทั้งหมดเป็น Public get/set (ซึ่งก็สมเหตุสมผล เพราะจะต้องทำการดีซีเรียลไลซ์คุณสมบัติเหล่านั้น)
แม้แต่ในโพสต์ที่เกี่ยวข้องนี้ ฉันเห็นว่าวิธีแก้ปัญหาของพวกเขาจบลงด้วยการ ทุกสิ่งที่สาธารณะซึ่งละเมิดความรู้สึกในการเขียนโปรแกรมที่ดีของฉัน มีวิธีแก้ไขปัญหานี้ไหม? ฉันจำเป็นต้องยอมรับวิธีแก้ปัญหานี้หรือบางอย่างเช่นความไม่เปลี่ยนรูปของไอศกรีมแท่งแล้วพอใจกับมันหรือไม่?
อีกสิ่งหนึ่งที่ฉันลองคือสิ่งนี้ โดยที่ฉันจะมีคลาสพื้นฐานสำหรับทุกสิ่งและคลาสที่ได้รับซึ่งทำให้เซ็ตนี้ไร้ประโยชน์:
/// <summary>
/// This represents a discovered virtual-machine template that can be
/// instantiated into a RunningVirtualMachine
/// </summary>
[DataContract]
[XmlRoot("VMTemplate")]
public class VirtualMachineTemplateBase
{
[DataMember]
public virtual ulong SizeInBytes { get; set; }
}
/// <summary>
/// This class is the real guts of VirtualMachineTemplate that we're hiding
/// from the base class.
/// </summary>
[XmlInclude(typeof(VirtualMachineTemplateBase))]
public class VirtualMachineTemplate : VirtualMachineTemplateBase, IXmlPicklable, IEnableLogger
{
ulong _SizeInBytes;
public override ulong SizeInBytes {
get { return _SizeInBytes; }
set { }
}
}