gpt4 book ai didi

c# - 从客户端访问 WCF 服务的泛型程序

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:52 25 4
gpt4 key购买 nike

请看下面客户端访问WCF服务的代码

函数获取优先权

public List<Priority> GetPriority()
{
List<Priority> lstPriority = new List<Priority>();

using (TmsServiceClient client = new TmsServiceClient())
{
try
{
lstPriority = client.GetPriority();
}
catch (FaultException<TMSCustomException> myFault)
{
Console.WriteLine(myFault.Detail.ExceptionMessage);
client.Abort();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
client.Abort();
}
}
return lstPriority;
}

函数获取状态:

public List<Status> GetStatus()
{
List<Status> lstStatus = new List<Status>();
using (TmsServiceClient client = new TmsServiceClient())
{
try
{
lstStatus = client.GetStatus();
}
catch (FaultException<TMSCustomException> myFault)
{
Console.WriteLine(myFault.Detail.ExceptionMessage);
client.Abort();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
client.Abort();
}
}

return lstStatus;
}

这两种方法都很好用。可以看出,这两个方法有很多相似之处,只是在方法调用的时间和返回类型上有所不同。这可以通用吗?如果是这样怎么办?或者任何其他更好的方法,这样 catch 异常 block 代码就不会每次都重复。

提前致谢

最佳答案

您可以轻松重构几乎整个 Get ...方法变成通用方法。唯一真正可变的部分是调用哪个客户端方法,这可以使用 Func<T,TResult> 轻松解决。 .

private List<T> Get<T>(Func<TmsServiceClient, List<T>> clientCall)
{
List<T> results = new List<T>();
using (TmsServiceClient client = new TmsServiceClient())
{
try
{
// invoke client method passed as method parameter
results = clientCall(client);
}
catch (FaultException<TMSCustomException> myFault)
{
Console.WriteLine(myFault.Detail.ExceptionMessage);
client.Abort();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
client.Abort();
}
}

return results;
}

现在您的方法实现如下所示:

public List<Status> GetStatus()
{
return Get<Status>(client => client.GetStatus());
}

public List<Priority> GetPriority()
{
return Get<Priority>(client => client.GetPriority());
}

根据 OP 评论进行编辑:

Func<TmsServiceClient, List<T>> 作为参数传递给 Get<T>方法是 delegate . Delegate 是一种函数指针 - 您用来委托(delegate)一些稍后要执行的操作的对象(因此得名)。

Func<TmsServiceClient, List<T>>基本上是一个接受一个输入参数(TmsServiceClient 类型)并返回 List<T> 的委托(delegate)结果。

现在,我们在 GetStatus 中做什么?我们创建了此类委托(delegate)的一个实例(通过 lambda expression )——我们“告诉”它执行 GetStatus() Client 上的方法对象,我们将提供:

    // this line works the same as in example above
// Take client as parameter call its .GetStatus method
return Get<Status>((TmsServiceClient client) => client.GetStatus());

这正是发生在

    // invoke client method passed as method parameter
results = clientCall(client);

行。委托(delegate)执行我们要求的方法。

关于c# - 从客户端访问 WCF 服务的泛型程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com