2009-01-09 62 views

回答

23

您可以使用singleton pattern来保留每个Web服务的单个实例,而不用担心处置您的Web服务。 Web服务是无状态的,因此它们可以安全地在Web服务器上的连接和线程之间共享。

以下是可用于保存对Web服务实例的引用的Web服务类的示例。这个单例是懒惰和线程安全的。建议如果你让你的单身人士懒惰,他们也会按照相同的逻辑保持线程安全。要详细了解如何执行此操作,请阅读Implementing Singletons上的C#深度文章。

还请记住,您可能遇到WCF Web服务的问题。我建议阅读WCF's instance management techniques article,特别是单身部分,了解更多详情。

public static class WS 
{ 
    private static object sync = new object(); 
    private static MyWebService _MyWebServiceInstance; 

    public static MyWebService MyWebServiceInstance 
    { 
     get 
     { 
      lock (sync) 
      { 
       if (_MyWebServiceInstance == null) 
       { 
        _MyWebServiceInstance= new MyWebService(); 
       } 
      } 
      return _MyWebServiceInstance; 
     } 
    } 
} 

然后当你需要访问你的网络服务,你可以这样做:

WS.MyWebServiceInstance.MyMethod(...) 

var ws = WS.MyWebServiceInstance; 
ws.MyMethod(...) 

我已经成功地使用了几个项目,它这个模式运行良好,但正如tvanfosson在下面的评论中提到的,更好的策略是使用DI框架来管理您的Web服务实例。

+0

谢谢!我现在肯定会实现一个使用。 – BeaverProj 2009-01-11 19:02:18

+0

@DanHerbert,我们对你的问题公开提供了修订控制。所以你不需要用大量划掉的东西来混乱你的帖子。它令人分心 – mmcdole 2009-01-16 03:42:12

1

我认为DataService继承了Dispose组件。

0

你想在这里完成什么?

如果您担心性能,那么我会更担心托管web服务的服务器的响应速度和网络速度,因为它们会显着影响您等待Web服务调用完成的时间长度(除非它的异步)。

MSDN上的示例没有调用Dispose,它的显然是垃圾收集器将会完成它的工作,所以除非你的实时系统需要每秒处理超过100,000条记录,否则你可能不会需要想出一种处理资源或管理内存的方法。

1

实现IDispose的对象应该手动处理以协助垃圾收集器。

如果您的对象是短暂使用using块。对于可以保留的对象,确保它们保留的对象在处置它们时也将它们处理掉。

相关问题