Конструктор в WCF - PullRequest
       11

Конструктор в WCF

3 голосов
/ 15 апреля 2009

Может кто-нибудь просто сказать мне, как создать объект Datacontract в WCF. У меня есть приложение, в котором мне нужен конструктор, но на стороне клиента, когда я создаю объект, он не показывает конструктор. Я знаю одно решение, подобное добавить частичный класс, связывающийся с конструкторами. путаница здесь "где добавить частичный класс"

Пожалуйста, кто-нибудь, помогите мне ........ Я новичок в C # и .net.

Ответы [ 5 ]

6 голосов
/ 24 апреля 2009

Есть два способа сделать конструктор класса 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.

2 голосов
/ 15 апреля 2009

Чтобы сделать то, что вы хотите, вы должны разделить тип контракта данных между клиентом и службой. Для этого есть опция в диалоговом окне «Добавить ссылку на службу».

0 голосов
/ 15 апреля 2009

В сгенерированном коде, какой у него конструктор? Если (неабстрактный, нестатический) класс не имеет явного конструктора, он получает конструктор по умолчанию (открытый, без параметров). Так какой код вы видите (для этого объекта) в сгенерированном коде?

0 голосов
/ 15 апреля 2009

WSDL (язык описания веб-сервиса) вашего веб-сервиса не сообщает конструктору информацию о DataContract. Сериализация применяется только к полям [DataMember] в ваших классах DataContract. Следовательно, сгенерированный клиент не содержит никаких методов или конструкторов вашего DataContract, он, конечно, имеет только конструктор по умолчанию без параметров.

Если вы действительно хотите добавить конструкторы в классы DataContract, вы можете открыть файл Reference.cs в вашем веб-справочнике в вашем решении, найти класс и изменить его. Обратите внимание, что если вы обновите веб-ссылку, настроенный код будет перезаписан.

Другое решение, такое как ваше высказывание, создало частичный класс для сгенерированного класса DataContract. Вы узнаете, как это сделать, проверив файл reference.cs. (чтобы увидеть файл reference.cs, нажмите «Показать все файлы» в VS)

0 голосов
/ 15 апреля 2009

В моем WCF

ITestPointSrv.cs

[ServiceContract]    
public interface ITestPointSrv    
{    
    [OperationContract]
    DataTable GetMonthEvents(Int32 p_nYear, Int32 p_nMonth);
}

TestPointSrv.svc.cs

public DataTable GetMonthEvents(Int32 p_nYear, Int32 p_nMonth)    
{    
    return (new OccasionType()).GetMonthEvents(p_nYear, p_nMonth);    
}

В моем WCF

Scheduler.cs

TestPointSrvClient srv = new TestPointSrvClient();    
DataTable dtEvents = srv.GetMonthEvents(this.dtpMonth.Year,
    this.dtpMonth.Month);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...