静态类中的对象实例

时间:2012-01-20 09:56:41

标签: c# wcf service-reference

我正在开发一个包含多个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();

每次我们尝试调用该对象时都会创建一个新对象,或者每次调用它时它是否都是该对象的同一个实例?

4 个答案:

答案 0 :(得分:2)

如果你想这样做,请创建

Singleton Service

单件服务是最终的可共享服务。当服务配置为单例时,所有客户端都独立地连接到同一个众所周知的实例,无论它们连接到哪个服务端点。单身人士服务永远存在,只有在主人关闭后才会被处理掉。在创建主机时,单独创建一次。

通过将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可能会抛出异常,因此最好抓住异常并手动优雅地关闭代理。)