前のやり方がダサいのでもう少し

こうする。

class Repository{
   override protected void connect(){
      if(!externalConnection){
         connection = getConnection();
         connection.connect();
      }
   }
   override protected void disconnect(){
      if(!externalConnection){
         connection.disconnect();
      }
   }
}
class ProductRepository : Repository{
   public void save(Product product){
     try{
       connect();
       connection.executeUpdate("INSERT INTO ...");
     }
     finally{
       disconnect();
     }
     
   }
}
class Comsumer{
  void save_proc(){
    var productRepository = new ProductRepository();
    productRepository.save(product);
  }
  void save_proc(){
    using(var connection = getConnection()){
      var productRepository = new ProductRepository();
      productRepository.save(product);

      var orderRepository = new OrderRepository(connection);
      orderRepository.save(order);
    }
  }
   
}

これで「外から接続をもらった場合は何もせず、接続が設定されてない時だけ接続|接続終了」が可能になる。
ただしRepositoryが自分で接続を開く時スタックか何かでconnect,disconnectの回数管理しないと内部呼び出しの場合に対応できなくなる。
AOPぽいものを考えると、常に

  va repository = connection.getRepository();

見たいにするほうが書きやすいかもしれないけど。