我有一个DLL,可以通过WCF或直接向QuickBooks处理数百个方法调用。在每种方法中,我都有类似的代码:
public Response GetSomethingFromQuickBooks()
{
Response response = new Response();
if (useWCF == true)
{
System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
System.ServiceModel.EndpointAddress endpoint = new System.ServiceModel.EndpointAddress(new Uri(wcfEndpoint));
WCFClient = new ServiceReference.OperationsClient(binding, endpoint);
WCFClient.CreateConnection(opsConnectionDTO);
response = WCFClient.GetSomethingFromQuickBooks();
try
{
WCFClient.Close();
}
catch (Exception)
{
WCFClient.Abort();
}
}
else
{
response = qbManager.GetSomethingFromQuickBooks();
}
return response;
}
我有几个问题:
1)这是基于每个方法处理WCF调用的正确方法吗?
2)有没有办法可以在每个方法的基础上实例化WCF客户端而不必在每个方法中放置重复的代码?
答案 0 :(得分:1)
这是基于每个方法处理WCF调用的正确方法吗?
好吧,如果我们可以方便地忽略你正在与定义了数百个操作的服务进行交谈的事实,那么你仍然可以做一些不同的事情。
为每次通话启动客户端频道过多。虽然很低,但成本仍然很高。最好有一些可以依赖的包装器或工厂以合理的方式管理客户端通道的生命周期。
此外,您似乎正在使用服务引用来调用该服务。由于许多原因,这是次优的,并且应该仅作为最后的手段来完成,例如,当您无法通过服务元数据访问服务接口定义时。否则你应该使用WCF Channel。
有没有办法可以基于每个方法实例化WCF客户端 而不必在每个方法中放入重复的代码?
撇开客户端通道通常可重用的事实,只要它们没有出现故障,您可以利用IoC容器注入包含新初始化的客户端通道实现的运行时依赖项。或者重新实现WCFClient作为前面提到的客户端通道的可重用包装器。