我有一个有点简单的网络应用程序,它使用 ASMX 网络服务作为其唯一的数据访问。所有信息都从中获取,并保存到其中。它工作正常,所以不碍事。
我刚刚更新到 VS2012,它抱怨实现服务引用的类,不继承自 IDisposeable。
经过一番阅读,我更加困惑,因为有些解决方案非常复杂,有些很简单。简短的版本是,在了解这么少之后,我似乎无法适应我的应用程序的制作方式。
我有几个数据访问类,都专注于一个区域的方法。例如,一种用于与客户相关的呼叫的数据访问,一种用于与产品相关的呼叫等。
但由于它们都使用相同的服务,它们都派生自包含引用的基本数据访问类。
这是基本数据访问类:
public class BaseDataAccess
{
private dk.odknet.webudv.WebService1 _service;
private string _systemBrugerID, _systemPassword;
public BaseDataAccess()
{
//Gets the system user and password that is stored in the webconfig file. This means you only have to change
//the username and password in one place without having to change the code = its not hardcoded.
_systemBrugerID = System.Configuration.ConfigurationManager.AppSettings["SystemBrugerID"].ToString();
_systemPassword = System.Configuration.ConfigurationManager.AppSettings["SystemPassword"].ToString();
_service = new dk.odknet.webudv.WebService1();
}
/// <summary>
/// Gets an instance of the webservice.
/// </summary>
protected dk.odknet.webudv.WebService1 Service
{
get { return _service; }
}
/// <summary>
/// Gets the system user id, used for certain methods in the webservice.
/// </summary>
protected string SystemBrugerID
{
get { return _systemBrugerID; }
}
/// <summary>
/// Gets the system user password, used for certain methods in the webservice.
/// </summary>
protected string SystemPassword
{
get { return _systemPassword; }
}
}
以下是派生类如何利用基类中的服务引用:
public class CustomerDataAccess : BaseDataAccess
{
public CustomerDataAccess() {}
/// <summary>
/// Get's a single customer by their ID, as the type "Kunde".
/// </summary>
/// <param name="userId">The user's username.</param>
/// <param name="customerId">Customer's "fkKundeNr".</param>
/// <returns>Returns a single customer based on their ID, as the type "Kunde".</returns>
public dk.odknet.webudv.Kunde GetCustomerById(string userId, string customerId)
{
try
{
return Service.GetKunde(SystemBrugerID, SystemPassword, userId, customerId);
}
catch (Exception e)
{
Debug.WriteLine(e);
throw;
}
}}
那么在这种情况下我到底该如何实现 IDisposable 呢?我只是无法绕过它。
编辑 我已经摆弄了服务参考,并提出了这个:
/// <summary>
/// Gets an instance of the webservice.
/// </summary>
protected dk.odknet.webudv.WebService1 Service
{
get
{
try
{
using (_service = new dk.odknet.webudv.WebService1())
{
return _service;
}
}
catch (Exception e)
{
Debug.WriteLine(e);
throw;
}
}
}
是的,异常处理不是很好,我会解决这个问题(感谢建议),但 VS2012 不再抱怨缺少 IDisposable。服务的实例化已从构造函数中删除。该应用程序运行良好,无需任何进一步修改。这足够了吗?