Добавить методы в сгенерированный код прокси клиента WCF - PullRequest
0 голосов
/ 28 мая 2010

Я хотел бы добавить один дополнительный метод для каждой операции службы в моем коде прокси-клиента WCF (т. Е. Сгенерированный класс, производный от ClientBase). Я написал расширение для Visual Studio, которое имеет реализацию IOperationContractGenerationExtension, но этот интерфейс, по-видимому, только предоставляет возможность изменять интерфейс службы, а не класс ClientBase.

Есть ли способ генерировать новые методы в классе прокси-клиента?

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

Насколько я знаю, эти классы всегда частичные классы :

public partial class MyWCFServiceClient : ClientBase<IMyWCFService>, IMyWCFService 
{
  ...
}

, чтобы вы могли легко расширить их своим вторым файлом, который добавляет метод к тому же частичному классу:

YourOwnFile.cs

public partial class MyWCFServiceClient 
{
   public void NewMethod1()
   {
   }

   public void NewMethod2()
   {
   }
}
0 голосов
/ 01 июня 2010

Я справился с этим, сгенерировав класс-оболочку для производного от ClientBase класса во время процесса импорта. Сначала я попытался сгенерировать дополнительный частичный класс с тем же именем, что и у клиентского класса, но это привело к тому, что остальная часть генерации кода перестала работать должным образом.

Итак, мой окончательно сгенерированный код выглядит примерно так:

(генерируется встроенным прокси-генератором WCF):

public interface ServiceReference1
{
    IAsyncResult BeginWebMethod1(AsyncCallback callback, object asyncState);
    void EndWebMethod1(IAsyncResult result);

    IAsyncResult BeginWebMethod2(AsyncCallback callback, object asyncState);
    void EndWebMethod2(IAsyncResult result);

    // ...
}

public class ServiceReference1Client
{
    public event EventHandler<AsyncCompletedEventArgs> WebMethod1Completed;
    public event EventHandler<AsyncCompletedEventArgs> WebMethod2Completed;

    public void WebMethod1Async() { /* ... */ }
    public void WebMethod2Async() { /* ... */ }

    // ...
}

(сгенерировано моим заказом IOperationContractGenerationExtension):

public class ServiceReference1Wrapper
{
    private ServiceReference1Client _client;

    public ServiceReference1Wrapper(ServiceReference1Client client)
    {
        _client = client;
    }

    public IObservable<AsyncCompletedEventArgs> WebMethod1()
    {
        _client.WebMethod1Async();
        // ...
    }

    public IObservable<AsyncCompletedEventArgs> WebMethod2()
    {
        _client.WebMethod2Async();
        // ...
    }

    // ...
}

Примечание: я использую Silverlight, поэтому все асинхронно.

...