我使用单例模式创建了一个我在win表单应用程序中使用的Web服务的单个实例。我已经看到这是Web应用程序的好习惯。我想知道winform应用程序是否也一样?此外,我应该担心处理Web服务(即后来的代理对象) - 它有一个.Dispose方法,但我没有在我的代码中的任何地方调用它。在我的应用程序中,我以异步方式调用所有Web方法。这可能听起来很傻但我不知道我需要在哪里调用dispose。有人可以帮忙吗?
class ListService
{
private static RetrieveList s_proxy;
private static readonly object s_lock = new object();
private static readonly string s_webServiceURL = Authentication.RetrieveListUrl;
internal static RetrieveList Proxy
{
get
{
lock (s_lock)
{
if (s_proxy == null)
{
s_proxy = new RetrieveList();
s_proxy.Url = s_webServiceURL;
}
return s_proxy;
}
}
}
}
答案 0 :(得分:4)
如果您有一个应用程序的单个实例,该对象将在应用程序关闭或崩溃时被销毁。您可以在终结器中调用Dispose,但不能保证成功。
除非Dispose做了一些重要的事情,比如保存你的文件(它不应该),我会说,不用太担心。事实上,它是一个单身人士意味着它永远存在,处置只是为了释放原本会留在身边的资源。对象仍然存在,所以没有什么可以解放的。
然而,有些人可能会对此不以为然并说“如果Dispose做了一件对我来说很重要的事情,除了释放资源?”。在应用程序运行后,您仍然可以调用Dispose:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LogAnalizzer());
ListService.Dispose(); // or whatever you're going to call it
}
我已经看到这是Web应用程序的好习惯。我想知道winform应用程序是否也一样?
根据经验,当你的应用程序作为一个整体只需要一个实例时,一个(线程安全的)单例通常是一个好主意:缓存,数据库连接,代理,应用程序本身,记录仪。没有任何迹象表明单身人士也不应该适用于你的WinForm应用程序。
但请记住,您必须仔细考虑您的设计。如果您有记录器并且文件无法访问该怎么办?如果代理失去连接怎么办?等等。
答案 1 :(得分:3)
不确定C#是如何做到的,但在Java中,你需要创建一个私有构造函数来阻止人们做new ListService()