コネクションの明示をデリゲートで表現すると文法エラーを把握しづらい

Coordinator
May 5, 2013 at 2:58 AM
コネクションの明示がKiaryuのコンセプトにあり、それを表現するために
DB.Connect(
    Sub(r)
        'TODO
    End End)
というデリゲートでの記述を採用しましたが、
デリゲート内で文法エラーがあると
デリゲート全体にエラーマーク(波下線)がついてしまい、どこに記述間違があるかを把握しにくい。
VSの仕様なのか、VBの仕様かわかりませんが、なんにしろ使いにくいのは間違いない。
Coordinator
May 5, 2013 at 3:25 AM
デリゲートを使用するとこの問題がつきまとうので、デリゲートを使用しない案を考えてみます。

1.Usingにする
記述イメージはこのようになります。
Using r = Db.Connect
    'TODO
End Using
字下げも少なく、コネクション期間も明示されており、よさそう。
実現するにはModelLoaderのDisposeイベントにコネクション切断処理を記述する(a)、もしくは差し込む(b)必要がある。

(a)の方法をとった場合、ModelLoaderクラスでコネクション開閉をしてしまい、
DBクラス(コネクション開閉とそのロギング)の存在意義が不明瞭になる。

(b)の方法をとった場合、ModelLoaderクラスは廃棄されたことをDBクラスに通知して(インスタンス時に通知が走るような処理を差し込む)、
DBクラスでコネクションを切断する。

どちらかといえば(b)のほうが適切。


2.IDbConectionクラスの拡張メソッドにLoad、Fromを作ってしまう
イメージ
Using cn As IDbConnection = DB.CreateConnection
    'TODO
    Dim lst = cn.From(Of T).ToList
End Using
ModelLoaderにプロパティの概念がないならこれでもいいかもしれない。
ロギングにしても、1-(b)に挙げた方法で実装は可能と思われます。
なにより、使いなれたIDbConnectionがそのまま見えるというのは
「Kairyuに該当するメソッドがないとき手書きで対応できるな」という安心感がある(とおもう)。

問題は「パラメータ接頭語(=プロパティ)」でしょうか。
プロパティを拡張メソッドで表現することはできないので、
アプリケーション構成ファイルに接頭語を埋め込んでおき、拡張メソッドでその値を読み込んで返却というのが現実的。

・現在のアプリケーション構成ファイル
  <connection running-on="sqlce35">
    <environments>
      <environment name="sqlce35">
        <assembly path="./Kairyu.Extensions.Connection.SqlCe35.dll" type="Kairyu.Extensions.Connection.SqlCe35.SqlServerCeConnector"/>
        <parameter is-encrypt="false" cn-string="Data Source=Database.sdf"/>
      </environment>
  </connection>
</configuration>
・アプリケーション構成ファイル改定案
  <connection running-on="sqlce35">
    <environments>
      <environment name="sqlce35">
        <assembly path="./Kairyu.Extensions.Connection.SqlCe35.dll" type="Kairyu.Extensions.Connection.SqlCe35.SqlServerCeConnector"/>
        <cn-string is-encrypt="false" value="Data Source=Database.sdf"/>
        <prm prefix="@"><!--Oracleなら「:」-->
      </environment>
  </connection>
</configuration>
アプリケーション構成ファイルまで手をいれたくないのが本音ですが、案2で改良を検討します。
Coordinator
May 5, 2013 at 4:01 AM
メモ書き
アプリケーション構成ファイルのConnectionセクションはKairyuExtension.Connectionの範疇。
案2を採用するということはKairyuExtension.Connectionの利用がマストということになる。
よって、わざわざ別プロジェクト化する必要がないので、Kairyuプロジェクトに統合することになる。
ここまでは特に問題ない。
※互換性の問題は大アリですが。

ただ、この構成ファイルがないとパラメータ接頭語が取得できないので、ORMとしてはまともに動かなくなる。
コネクション生成(任意)とパラメータ接頭語(マスト)の宣言は切り離したほうがよい。
  <!--接続文字列の切り替え(任意項目)-->
  <connection running-on="sqlce35">
    <environments>
      <environment name="sqlce35">
        <assembly path="./Kairyu.Extensions.Connection.SqlCe35.dll" type="Kairyu.Extensions.Connection.SqlCe35.SqlServerCeConnector"/>
        <dbparameter prefix-name="@">
      </environment>
  </connection>
  <!--パラメータ接頭語(接続文字列の切り替えがない場合は必須)-->
  <dbparameter prefix-name="@"/> 
こんな感じ。
なお、両方とも記述した場合、接続文字列から取得できた接頭語が優先されます。