Есть два способа сделать конструктор класса DataContract. Вероятно, наиболее последовательный способ - это перенести DataContract в отдельную библиотеку классов, на которую вы ссылаетесь в своей службе и клиенте. Как заявил Джон Сондерс, существует способ указать Visual Studio использовать существующий класс при создании прокси-кода для указанной службы. После этого вы можете просто добавить конструктор в этот класс.
Если вы хотите, чтобы конструктор появлялся только на стороне клиента, или по какой-то другой причине не можете использовать общую библиотеку классов, вы можете создать частичный класс. Для такого класса действительно нет определенного «местоположения». Все, что требуется для предоставления конструктора через частичный класс, - это создать новый файл класса, который определяет тот же класс, что и ваш прокси.
Итак, если у вас есть прокси-класс ReferencedServiceProxy.ContractClass, вам нужно создать новый файл кода, который определяет частичный класс
namespace ReferencedServiceProxy
{
partial class ContractClass
{
// Constructor. Naturally the constructor cannot overwrite one
// defined in the proxy class already. Not sure if those define
// a default constructor.
public ContractClass()
{
// Implementation
}
}
}
Пока файл компилируется нормально, компилятор делает все остальное.
Однако, не зная необходимости конструктора, вероятно, стоит указать, что конструктор не вызывается при десериализации объекта на стороне клиента, поскольку объект не «конструируется» как таковой.
http://mehranikoo.net/CS/archive/2007/11/09/DataContractConstructorsInWCF.aspx имеет отношение к тому, что происходит во время десериализации и как это влияет. Просто то, чему я научился трудным путем ... с помощью silverlight, который даже не поддерживает атрибут OnDeserialization.