Сохранение подключений к веб-сервисам открыто все время работы приложения

У меня просто есть вопрос, связанный с "лучшей практикой". Если этот вопрос не является конструктивным, просто проголосуйте:)

У меня была беседа с коллегой несколько дней назад, у нас есть две совершенно разные философии, когда речь идет о передовой практике в отношении открытых соединений с веб-сервисом, 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-сервера пул соединений имеет верхний предел соединений, либо по умолчанию, либо заданный в строке соединения. Если вы не закроете соединения, которые вы открываете, вы истощите бассейн.

Согласитесь с комментарием Джеймса Торпа о том, что это может зависеть от стоимости создания ресурса, но указанные вами примеры (соединение с БД, вызов веб-службы) не должны быть особенно дорогими.

Другие вопросы по тегам