Сохранение подключений к веб-сервисам открыто все время работы приложения
У меня просто есть вопрос, связанный с "лучшей практикой". Если этот вопрос не является конструктивным, просто проголосуйте:)
У меня была беседа с коллегой несколько дней назад, у нас есть две совершенно разные философии, когда речь идет о передовой практике в отношении открытых соединений с веб-сервисом, 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();
}
}
Приведенный выше код является просто примерами, которые упрощены (и написаны в текстовом редакторе stackru), но я думаю, что они показывают необходимую философию.
Итак, первый пример будет открывать и закрывать соединение при каждом вызове. Второй пример будет держать соединение открытым в течение более длительного периода времени.
Какова, на ваш взгляд, "общая" лучшая практика?
1 ответ
Я бы порекомендовал избавиться от любых неуправляемых ресурсов как можно скорее, как вы изложите в своем примере. Сборка мусора будет в конце концов, но зачем ждать? Полный ответ здесь: Правильное использование интерфейса IDisposable
В частности, для SQL-сервера пул соединений имеет верхний предел соединений, либо по умолчанию, либо заданный в строке соединения. Если вы не закроете соединения, которые вы открываете, вы истощите бассейн.
Согласитесь с комментарием Джеймса Торпа о том, что это может зависеть от стоимости создания ресурса, но указанные вами примеры (соединение с БД, вызов веб-службы) не должны быть особенно дорогими.