现在它有点高于我的头,但是应该在客户端代理类中使用的“高阶函数”?这是正确的用法吗?:
public class MyProxy
{
readonly IMyService service =
new ChannelFactory<IMyService>("IMyService").CreateChannel();
public ResponseObject Foo(RequestObject request)
{
return UseService((IMyService service) =>
service.Bar(request));
}
T UseService<T>(Func<IIssueTrackerService, T> code)
{
bool error = true;
try
{
T result = code(issueTrackerChannel);
((IClientChannel)issueTrackerChannel).Close();
error = false;
return result;
}
finally
{
if (error)
{
((IClientChannel)issueTrackerChannel).Abort();
}
}
}
}
我真正想要的只是一些指导,以及正确的方法。
答案 0 :(得分:1)
这实际上并不坏。也许您可以转换为ICommunicationObject
,因为您的主机也需要相同的代码。
考虑它的方式很接近是友好的电话。请完成我的呼叫并将代理返回到连接池。 Abort是“我不在乎,关闭代理,因为它已经死了,也将它从池中删除,因为它已经死了”。
根据您的代码,如果可能,您可能希望从函数调用部件中抽象代码的“WCF代理”部分。这样,您就可以单独测试应用程序逻辑与WCF代理程序代码。
您可能希望查看try {} catch(CommunicationException),以便您可以将WCF异常分别处理为应用程序级异常,而不是finally。
即
try
{
try
{
proxy.call();
//app logic
((ICommunicationObject)proxy).Close();
}
catch (SomeAppException)
{
//recover app exception
}
}
catch (CommunicationException)
{
((ICommunicationObject)proxy).Abort();
}