前のやり方がダサいのでもう少し
こうする。
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();
見たいにするほうが書きやすいかもしれないけど。