我刚才有一个与"最佳实践相关的问题"。如果这个问题不具有建设性,那么就把它投票吧:)。
我几天前与同事讨论过,当涉及到与Web服务,COM对象,数据库等的开放连接的最佳实践时,我们有两种完全不同的理念。
我更喜欢在实现IDisposable的类中包装连接代码,并让它处理所有连接等等。一个简短的例子。
public class APIWrapper : IDiposable
{
public APIWrapper(...)
{
DataHolder = new DataHolder(...);
/// Other init methods
Connect();
}
public [Webservice/Database/COM/etc.] DataHolder { get; private set; }
public void Connect()
{
DataHolder.Connect(...);
}
public void Disconnect()
{
DateHolder.Disconnect();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if(disposing)
{
if (DataHolder != null)
{
Disconnect();
DataHolder = null;
}
}
}
}
我将在我的数据控制器中使用它。
public class UserController
{
....
public IList<User> getUsers()
{
using(APIWrapper datalayer = new APIWrapper(...))
{
var users = datalayer.DataHolder.GetUsers();
/// Map users to my enity of users
return mappedUsers;
}
}
}
我的同事看起来像这样:
public class UserController
{
protected [Webservice/Database/COM/etc.] DataHolder { get; set; }
public UserController()
{
DataHolder = new DataHolder(...);
DataHolder.Connect(...);
}
public IList<User> getUsers()
{
var users = DataHolder.GetUsers();
/// Map users to my enity of users
return mappedUsers;
}
/// Who should call this?
public void Dispose()
{
DataHolder.Disconnect();
}
}
上面的代码只是简化的示例(并编写了我的stackoverflow文本编辑器),但我认为它们显示了必要的哲学。
因此,第一个示例将在每次调用时打开和关闭连接。第二个示例将保持连接打开更长的时间。
什么是&#34;一般&#34;你认为最好的做法?
答案 0 :(得分:0)
我建议您尽快处理任何非托管资源,如您在示例中所述。垃圾收集最终会到达那里,但为什么要等?综合答案:Proper use of the IDisposable interface
特别是重新SQL服务器连接池具有连接的上限,可以是默认连接,也可以在连接字符串中定义。如果你没有关闭你打开的连接,你将耗尽游泳池。
同意James Thorpe评论这可能取决于创建资源的成本,但您指定的示例(数据库连接,Web服务调用)不应该特别昂贵