我想爲我的WCF客戶端代理代碼(即從ClientBase
派生生成的類)中的每個服務操作添加一個附加方法。我已經編寫了一個具有IOperationContractGenerationExtension
實現的Visual Studio擴展,但此接口似乎只顯示修改服務接口的功能,而不是ClientBase
派生的類。向生成的WCF客戶端代理代碼添加方法
有沒有什麼辦法可以在代理客戶端類中生成新的方法?
我想爲我的WCF客戶端代理代碼(即從ClientBase
派生生成的類)中的每個服務操作添加一個附加方法。我已經編寫了一個具有IOperationContractGenerationExtension
實現的Visual Studio擴展,但此接口似乎只顯示修改服務接口的功能,而不是ClientBase
派生的類。向生成的WCF客戶端代理代碼添加方法
有沒有什麼辦法可以在代理客戶端類中生成新的方法?
我身邊這讓通過生成包在導入過程中,每個類爲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,所以這就是爲什麼一切都是異步的。
據我所知,這些類總是部分類:
public partial class MyWCFServiceClient : ClientBase<IMyWCFService>, IMyWCFService
{
...
}
,因此您可以輕鬆地將其與添加方法相同的部分類自己,第二個文件擴展:
YourOwnFile.cs
public partial class MyWCFServiceClient
{
public void NewMethod1()
{
}
public void NewMethod2()
{
}
}
感謝您的回答。我想要做的是自動生成其他方法。如果可能的話,我想避免手寫它們。 – dcstraw 2010-05-28 20:52:55
@dcstraw:根據什麼自動生成?這些方法有什麼作用? WCF具有很多可擴展點 - 無論是在客戶端還是在服務器上 - 但是您必須對您要做的事情有更具體的瞭解,以便我們能夠幫助並引導您朝着正確的方向前進... – 2010-05-28 21:04:50
我想爲每個返回IObservable的操作添加一個方法,這樣我就可以將Rx與Web服務方法一起使用,而無需從異步事件手動創建IObservables。 – dcstraw 2010-05-28 21:52:49
IOperationContextGenerationExtension確實是WCF的服務器端擴展點。你想要達到什麼?只需在代理類中添加幾個方法?看到我的答案。做更多的事情? – 2010-05-28 20:29:05
我認爲說IOperationContextGenerationExtension是服務器端並不準確。它鉤入導入過程,因此是客戶端(相對於Web服務)。至少這就是我使用它的方式。 – dcstraw 2010-06-01 16:21:09