2015-11-24 27 views
0

我只是与“最佳实践”的问题。如果这个问题不是建设性的,那么只是将它投票:)饲养连接打开整个申请时间

前几天我和一位同事讨论过,当涉及到与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(); 
      } 
    } 

上面的代码只是被简化(和我写的计算器文本编辑器)的例子,但我认为他们表现出应有的理念。

所以,第一个例子会打开和关闭在每个呼叫连接。第二个示例将使连接保持更长时间。

什么是“一般”在你看来,最好的做法?

+1

我认为这真的取决于情况以及最终目标实际上是你在说什么。例如,SQL服务器推荐第一种方法。但是,如果你正在处理需要很长时间来建立/拆除连接的事情,那么第二种方法会有争论。 –

+0

@PatrickHofman只要OP提供了他的实际代码而不是示例,它可能在代码审查上起作用。 –

+0

@JamesThorpe:的确,第一个例子可能会导致性能问题。但是当我使用基于COM的API进行通信时,我遇到了一个令人讨厌的例子,那就是COM对象中存在内存泄漏,因此保持连接打开实际上比第一个例子耗费更多时间。 – Alex

回答

0

我会建议尽快任何非托管资源的处置,当你在你的例子概括。垃圾收集最终会到达那里,但为什么要等呢?全面的答案在这里:Proper use of the IDisposable interface

更具体地说SQL服务器的连接池连接的上限,无论是默认或在连接字符串中定义。如果你没有关闭你打开的连接,你会耗尽游泳池。

与詹姆斯·索普的评论表示赞同,这可能取决于创建资源的成本,但您指定的例子(DB连接,调用Web服务)应该不会特别贵

+1

谢谢@matthew Evans。然后,我将继续按照“我的方式”这样做,但请始终记住创建资源的成本。 – Alex