保持与Web服务的连接可以打开整个应用程序时间

时间:2015-11-24 09:49:25

标签: c# web-services

我刚才有一个与"最佳实践相关的问题"。如果这个问题不具有建设性,那么就把它投票吧:)。

我几天前与同事讨论过,当涉及到与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;你认为最好的做法?

1 个答案:

答案 0 :(得分:0)

我建议您尽快处理任何非托管资源,如您在示例中所述。垃圾收集最终会到达那里,但为什么要等?综合答案:Proper use of the IDisposable interface

特别是重新SQL服务器连接池具有连接的上限,可以是默认连接,也可以在连接字符串中定义。如果你没有关闭你打开的连接,你将耗尽游泳池。

同意James Thorpe评论这可能取决于创建资源的成本,但您指定的示例(数据库连接,Web服务调用)不应该特别昂贵