2010-05-28 8 views
0

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

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

+0

IOperationContextGenerationExtension действительно является точкой расширения на стороне сервера для WCF. Что вы хотите достичь? Просто добавьте несколько методов в прокси-класс? См. Мой ответ. Что-то еще? –

+0

Я не думаю, что это точно сказать, что IOperationContextGenerationExtension является серверной. Он подключается к процессу импорта и, следовательно, является клиентской (по отношению к веб-службе). По крайней мере, так я его и использую. – dcstraw

ответ

0

Я получил вокруг этого генерируя обертку за класс для класса, созданного 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, поэтому все асинхронно.

2

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

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

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

YourOwnFile.cs

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

    public void NewMethod2() 
    { 
    } 
} 
+0

Спасибо за ответ. То, что я пытаюсь сделать, это автоматическое создание дополнительных методов. Я бы хотел избежать написания их вручную, если это вообще возможно. – dcstraw

+0

@dcstraw: автоматическое создание на основе чего? Что делают эти методы? WCF имеет множество точек расширяемости - как на клиенте, так и на сервере, - но вы должны быть немного более конкретными относительно того, что вы пытаетесь сделать, чтобы мы могли помочь вам и направлять вас в правильном направлении .... –

+0

Я хочу добавить метод для каждой операции, который возвращает IObservable, чтобы я мог использовать Rx с методами веб-службы без необходимости вручную создавать IObservables из событий async. – dcstraw

 Смежные вопросы

  • Нет связанных вопросов^_^