Всякий раз, когда я использую WCF, я всегда стараюсь создавать неизменяемые классы, которые в конечном итоге переходят по проводам (т.е. параметры, установленные в конструкторе, свойства доступны только для чтения). Однако это мешает сериализации WCF, которая требует, чтобы все свойства были публичными 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 { }
}
}