我正在开发一个包含多个WCF服务引用的Web应用程序。目前,每次我们需要拨打服务时,我们都会执行以下操作(例如):
Service.ServiceClient ServiceClient = new Service.ServiceClient();
ServiceClient.SomeMethod();
使用静态引用每个Service的静态类并调用该类会更好吗,从而避免每次我们想要调用它时创建ServiceClient对象的新实例吗?
例如:
public static class Services
{
private static Service.ServiceClient _ServiceClient = new Service.ServiceClient();
public Service.ServiceClient ServiceClient
{
get
{
return _ServiceClient;
}
}
}
而且,如果这样做,那就行了
private static Service.ServiceClient _ServiceClient = new Service.ServiceClient();
每次我们尝试调用该对象时都会创建一个新对象,或者每次调用它时它是否都是该对象的同一个实例?
答案 0 :(得分:2)
如果你想这样做,请创建
单件服务是最终的可共享服务。当服务配置为单例时,所有客户端都独立地连接到同一个众所周知的实例,无论它们连接到哪个服务端点。单身人士服务永远存在,只有在主人关闭后才会被处理掉。在创建主机时,单独创建一次。
通过将InstanceContextMode属性设置为InstanceContextMode.Single来配置单例服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}
答案 1 :(得分:2)
您可以拥有一个具有数据合同所公开的所有功能的类。所有这些方法都是静态的。现在,在这些功能中,您可以执行以下操作
public class ServiceManager{
public static CalculatedData SomeMethod()
{
var client = GetClient();
try
{
return client.SomeMethod();
}
catch(Exception ex)
{
//Handle Error
}
finally
{
if(client.State == System.ServiceModel.CommunicationState.Opened)
client.Close();
}
}
private static SomeClient GetClient()
{
return new ServiceClient();
}
}
消费者将像
一样消费它var calculatedData = ServiceManager.SomeMethod();
答案 2 :(得分:1)
它只会被创建一次,但是无论何时创建它都无法控制。处理此问题的常用方法是创建一个单独的静态方法(例如init),您可以在其中创建实例或在第一次调用时创建它。您应该检查singleton design pattern。
答案 3 :(得分:0)
您可以使用以下帮助程序:
private delegate void ServiceAction(Service.ServiceClient client);
private static void PerformServiceAction(ServiceAction serviceAction)
{
using (var client = new Service.ServiceClient())
{
serviceAction(client);
}
}
然后可以通过以下方式调用:
Helper.PerformServiceAction(client => client.SomeMethod());
它仍然为每个调用或一系列调用创建一个代理,但至少你的调用代码更轻。
(请记住,在wcf客户端代理中使用'using'并不是一个好主意,因为dispose可能会抛出异常,因此最好抓住异常并手动优雅地关闭代理。)