我只是与“最佳实践”的问题。如果这个问题不是建设性的,那么只是将它投票:)饲养连接打开整个申请时间
前几天我和一位同事讨论过,当涉及到与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();
}
}
上面的代码只是被简化(和我写的计算器文本编辑器)的例子,但我认为他们表现出应有的理念。
所以,第一个例子会打开和关闭在每个呼叫连接。第二个示例将使连接保持更长时间。
什么是“一般”在你看来,最好的做法?
我认为这真的取决于情况以及最终目标实际上是你在说什么。例如,SQL服务器推荐第一种方法。但是,如果你正在处理需要很长时间来建立/拆除连接的事情,那么第二种方法会有争论。 –
@PatrickHofman只要OP提供了他的实际代码而不是示例,它可能在代码审查上起作用。 –
@JamesThorpe:的确,第一个例子可能会导致性能问题。但是当我使用基于COM的API进行通信时,我遇到了一个令人讨厌的例子,那就是COM对象中存在内存泄漏,因此保持连接打开实际上比第一个例子耗费更多时间。 – Alex