C# WCF代理使用

C# WCF代理使用,c#,.net,wcf,proxy,using-statement,C#,.net,Wcf,Proxy,Using Statement,被贴出回应 现在这有点超出我的理解,但是“高阶函数”应该在客户端代理类中使用吗?这是正确的用法吗 public class MyProxy { readonly IMyService service = new ChannelFactory<IMyService>("IMyService").CreateChannel(); public ResponseObject Foo(RequestObject request) {

被贴出回应

现在这有点超出我的理解,但是“高阶函数”应该在客户端代理类中使用吗?这是正确的用法吗

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();
            }
        }
    } 
}
公共类MyProxy
{
只读IMyService服务=
新建ChannelFactory(“IMyService”).CreateChannel();
公共响应对象Foo(请求对象请求)
{
返回UseService((IMyService服务)=>
律师(请求));
}
T使用服务(功能代码)
{
布尔误差=真;
尝试
{
T结果=代码(issueTrackerChannel);
((IClientChannel)issueTrackerChannel.Close();
错误=错误;
返回结果;
}
最后
{
如果(错误)
{
((IClientChannel)issueTrackerChannel.Abort();
}
}
} 
}

我真正想要的是这里的一些指导,以及正确的方法。

这其实还不错。也许您可以转换为
ICommunicationObject
,因为主机也需要相同的代码

考虑这一点的方式是友好的电话。请完成我的呼叫并将代理返回到连接池。Abort是“我不在乎,因为代理死了而关闭代理,因为代理死了而将其从池中删除”

根据您的代码,如果可能,您可能希望从函数调用部分抽象代码的“WCF代理”部分。这样,您就可以独立于WCF代理代码对应用程序逻辑进行单元测试

您可能希望查看try{}catch(CommunicationException),这样您也可以将WCF异常单独处理为应用程序级异常,而不是最终处理

i、 e

try 
{
    try 
    {
        proxy.call();
        //app logic

        ((ICommunicationObject)proxy).Close();
    } 
    catch (SomeAppException)
    {
    //recover app exception
    }
}
catch (CommunicationException) 
{
    ((ICommunicationObject)proxy).Abort();
}