Добавление методов в сгенерированный код прокси-сервера клиента WCF

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

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


person dcstraw    schedule 28.05.2010    source источник
comment
IOperationContextGenerationExtension действительно является точкой расширения на стороне сервера для WCF. Чего вы хотите достичь? Просто добавить несколько методов в класс прокси? Смотрите мой ответ. Сделать что-нибудь еще ??   -  person marc_s    schedule 29.05.2010
comment
Я не думаю, что правильно сказать, что IOperationContextGenerationExtension является серверным. Он подключается к процессу импорта и, следовательно, является клиентским (относительно веб-службы). По крайней мере, я так использую.   -  person dcstraw    schedule 01.06.2010


Ответы (2)


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

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

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

YourOwnFile.cs

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

   public void NewMethod2()
   {
   }
}
person marc_s    schedule 28.05.2010
comment
Спасибо за ответ. Однако я пытаюсь автоматически сгенерировать дополнительные методы. Я бы не хотел писать их от руки, если это вообще возможно. - person dcstraw; 29.05.2010
comment
@dcstraw: автоматическое создание на основе чего? Что делают эти методы? WCF имеет множество точек расширяемости - как на клиенте, так и на сервере - но вам нужно будет немного конкретизировать, что вы пытаетесь сделать, чтобы мы могли помочь и направить вас в правильном направлении. .... - person marc_s; 29.05.2010
comment
Я хочу добавить метод для каждой операции, которая возвращает IObservable, чтобы я мог использовать Rx с методами веб-службы без необходимости вручную создавать IObservables из асинхронных событий. - person dcstraw; 29.05.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, поэтому все асинхронно.

person dcstraw    schedule 01.06.2010