我想为我的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