2010-05-28 99 views
0

我想爲我的WCF客戶端代理代碼(即從ClientBase派生生成的類)中的每個服務操作添加一個附加方法。我已經編寫了一個具有IOperationContractGenerationExtension實現的Visual Studio擴展,但此接口似乎只顯示修改服務接口的功能,而不是ClientBase派生的類。向生成的WCF客戶端代理代碼添加方法

有沒有什麼辦法可以在代理客戶端類中生成新的方法?

+0

IOperationContextGenerationExtension確實是WCF的服務器端擴展點。你想要達到什麼?只需在代理類中添加幾個方法?看到我的答案。做更多的事情? – 2010-05-28 20:29:05

+0

我認爲說IOperationContextGenerationExtension是服務器端並不準確。它鉤入導入過程,因此是客戶端(相對於Web服務)。至少這就是我使用它的方式。 – dcstraw 2010-06-01 16:21:09

回答

0

我身邊這讓通過生成包在導入過程中,每個類爲ClientBase派生類。實際上,我首先嚐試生成一個名稱與客戶端類相同的額外部分類,但這導致代碼生成的其餘部分停止正常工作。

所以我最終生成的代碼看起來像:

(所產生的內置WCF代理生成器):

public class ServiceReference1Wrapper 
{ 
    private ServiceReference1Client _client; 

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

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

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

    // ... 
} 

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生成)

注意:我使用的是Silverlight,所以這就是爲什麼一切都是異步的。

2

據我所知,這些類總是部分類

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

,因此您可以輕鬆地將其與添加方法相同的部分類自己,第二個文件擴展:

YourOwnFile.cs

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

    public void NewMethod2() 
    { 
    } 
} 
+0

感謝您的回答。我想要做的是自動生成其他方法。如果可能的話,我想避免手寫它們。 – dcstraw 2010-05-28 20:52:55

+0

@dcstraw:根據什麼自動生成?這些方法有什麼作用? WCF具有很多可擴展點 - 無論是在客戶端還是在服務器上 - 但是您必須對您要做的事情有更具體的瞭解,以便我們能夠幫助並引導您朝着正確的方向前進... – 2010-05-28 21:04:50

+0

我想爲每個返回IObservable的操作添加一個方法,這樣我就可以將Rx與Web服務方法一起使用,而無需從異步事件手動創建IObservables。 – dcstraw 2010-05-28 21:52:49