Раньше у меня была похожая проблема с сериализацией неизменяемых типов, в конце я решил реализовать интерфейс ISerializable и использовать SerializationInfo для хранения и извлечения приватных переменных на обоих концах процесса сериализации / десериализации:
http://theburningmonk.com/2010/04/net-tips-making-a-serializable-immutable-struct/
Я только что построил и запустил тестовое приложение, используя ту же технику, и, похоже, оно работает для меня. Таким образом, с точки зрения изменений в классе вашей клиники вы можете изменить его на:
[Serializable]
public class Clinic : ISerializable
{
public Clinic(string name, string id)
{
Name = name;
Id = id;
}
public Clinic(SerializationInfo info, StreamingContext context)
{
Name= info.GetString("Name");
Id= info.GetString("Id");
}
public string Name{get; private set;}
public string Id{get; private set;}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Id", Id);
}
}
Это решит проблему с передачей данных из WCF. Но с точки зрения дизайна я согласен с тем, что говорит Ладислав, и, как правило, вы захотите отделить свои доменные объекты от объектов, предназначенных исключительно для передачи сообщений (DataTransferObjects), и в этом случае вот пример того, как вы МОЖЕТЕ подойти к этому:
// the domain object (NOT EXPOSED through the WCF service)
public class Clinic
{
public Clinic(string name, string id)
{
Name = name;
Id = id;
}
public string Name{ get; private set;}
public string Id{ get; private set;}
// other methods encapsulating some business logic, etc.
...
}
// the corresponding DTO object for the domain object Clinic
// this is the type exposed through the WCF layer, that the client knows about
[DataContract]
public class ClinicDTO
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Id { get; set; }
}
// WCF service contract, NOTE it returns ClinicDTO instead of Clinic
[ServiceContract]
public interface IClinicService
{
[OperationContract]
ClinicDTO GetClinicById(string id);
}
Чтобы облегчить процесс перехода из Clinic в ClinicDTO, вы можете либо добавить метод в Clinic для этого, либо реализовать неявный / явный преобразователь. У меня есть пример, как это сделать здесь:
http://theburningmonk.com/2010/02/controlling-type-conversion-in-c/
Надеюсь, это поможет!