DynamicProxyの長短所
総まとめとして、現時点で判明しているDynamicAopProxyの長短所をまとめておく。
上記エントリにあるようにRealProxyに対する技術的なメリットは言われる通りなのですが、短所に関しては苦い経験があります。
s2dotnetがまだリリースされていない過去の案件では、出始めのSpring.NET+独自フレームワークにDynamicProxyを組み合わせインターセプタを実装していました。プラスして検索系永続層にはIBatis.NETを用いていたのですが派生開発においてオリジナル、Spring.NET、IBatis.NETで個別にリリースされたアセンブリが参照しているDynamicProxyのバージョンが異なるため各プロダクトをソースからコンパイルしてバージョンを統一する必要がありリビジョンも若かったので頻繁に不具合修正リリースが出るので管理が面倒でした。
メジャーなOSSで使われているのは実績や情報の入手も容易になるなどメリットもありますが、JavaでもCommons等がClassローダーで思わぬコンフリクトが起こってはまってしまうなどの問題がついて回るのが気になります。
RealProxyと二本立てにする場合に完全にプラグインな仕組みって可能なのかな?
■
[.NET]
S2UnitのXlsWriter
テストケースとテストデータをラウンドトリップしながら作成する為に用意されている機能の一つにXlsWriter
を使ってDataSetからエクセルファイルへ出力する事ができる。
しかし、現状では多少の不具合等があり利用者が困惑するケースがあるのではないかと思う。まず、エクセルファイルを出力する場合事前にフォルダが作成されていないと「failed: エラー情報 : E_FAIL(0x80004005) がありません。」のエラーとなります。メッセージからではなんの事か不明なためハマル人が出てくると思う、ドキュメントへ記載しても見逃す人が出るだろうからJETで生成する前にパスのフォルダが無い場合はメソッド内で暗黙的に生成した方がいいかな?
次に、データ型の扱いに若干問題があるようで
- SQLServerではtimestamp,image型等のバイナリカラムが定義されているレコードはエラーとなる。imageは無理としてもtimestampが使えないと困る
- データ型のマッピングがDBとしてのExcelのデータ型に記載されている定義と異なりSQLServerのbit型などはエラーとなるようだ。
- 日付の扱いがDB上で分以下が初期値(2006-04-14 11:24.000)ではなく(2006-04-14 11:24.215)等へセットされたレコードは出力時にエラーとなる。エクセルを手動作成できちんと書式設定が行われている場合は読込みは正常に行えるようだがJETを通して出力する際に書式は指定出来そうに無いため、出力時ゼロ埋しS2Assertでの検証は分単位までにする等の対応が必要かなぁ
id:rmiyaさん 対応可能ですか?とか言ってみる(^^;
検証した環境は.NET 1.1、SQLServer2000、Excel2000
S2Remoting.NET
WebService版は時間がないと対応出来そうにないので手元のコードをsvnへコミットしました。
興味のある方はhttps://www.seasar.org/svn/sandbox/s2remoting.netからチェックアウトして試してみてください。
.NETでInterTypeするとしたら
AOPのメソッドインターセプションを実現するのとは違い、Seasar2のInterTypeを.NET側では容易には実現できないだろう。ソースはまだ見ていないけれど、Seasar2はjavassistで既存の型を動的に拡張(アクセサを追加)していることは間違いない。
.NET直接Emitを使わずにjavassistやCGLibのような動的な型の変更を行えるライブラリとしてMonoProjectにRedirecting…ってのがあります。
http://www.dotnetguru.org/sarl/aspectdng/も内部でAOPやInterTypeを実現するのに使っているようです。ただ、現在のところドキュメントやサンプルがそろっていないのでEmitを良く理解していない自分にはちょっとソースを覗いた程度では使い方が不明だったorz
他にもRAIL - Runtime Assembly Instrumentation Library Projectがジャンルとしては近そうだが、こいつでInterTypeが実現できるかは不明?
InterTypeだけならロードした型に部分的な生成が行えて、そのアセンブリが再ロード可能ならCodeDOMのラッパーhttp://www.codeproject.com/csharp/refly.aspで前処理しても実現できる気もする。