Dxoの存在意義について考えてみた
前の日記で触れたSeasar.NETの方のS2Dxoの修正は
Java版と.NET版の既存実装の違いなどから
想定していたよりも難しそうなことがわかってきました(^^;
・・・だからと言うわけではないのですが、「Dxo」の存在意義について
改めて考えてみました。
(現実逃避とも言います)
まず、Dxoとは何ぞや?についてはJava版Seasarの
このページが参考になると思います。
「Dxo」というものへの需要として、一番ありそうな理由は
「同じ名前のプロパティの値を渡す部分をいちいち書くのが面倒」
だろうと自分は考えています。
だとすると、そこ"だけ"を肩代わりするブツを一つ用意しておけば
十分なのではないでしょうか。
後は個々のプロジェクトの仕様に合わせて自前で書く。
(何を何にどう変換するか、というのは仕様に依存する
部分が大きいと思いますし)
想定通りに動かなかったときの原因調査の手間なども考えると
多分その方が結局は楽だし安全。
そんな考えを元にしてこんなクラスを考えてみました。
(C#で書いています)
(キャッシュなどの補助要素は省略しています)
使い方は
///
/// エンティティ間の変換を行うテンプレートクラス
///
///変換元クラス
///変換先クラス
public class DxoTemplate
where S : class, new()
where D : class, new()
{
///
/// コンバート前処理デリゲート
///
///true=自動変換あり、false=自動変換なし
public delegate bool DelegatePreConvert(S source, D destination);///
/// 自動変換判定デリゲート
///
public delegate bool DelegateIsAuto(string sourcePropertyName);
(中略)private DelegatePreConvert _preConvertInvoker = null;
///
/// コンバート前処理プロパティ
///
public DelegatePreConvert PreConvertInvoker
(省略)private DelegateIsAuto _isAutoInvoker = null;
///
/// 自動変換判定プロパティ
///
public DelegateIsAuto IsAutoInvoker
(省略)///
/// 変換処理
///
/// 変換元
///変換先
public D Convert(S source) {
D destination = new D();
if(PreConvertInvoker != null && PreConvertInvoker(source, destination) == false) {
// 自動変換を行わない場合は処理を抜ける
return destination;
}
ConvertEachProperty(source, destination);
return destination;
}///
/// 各プロパティに対して変換処理を行う
///
///
///
protected virtual void ConvertEachProperty(S source, D destination) {
PropertyInfo[] sourcePropertyInfos = typeof (S).GetProperties(SourceBindFlags);
foreach (PropertyInfo info in sourcePropertyInfos) {
// 自動変換対象のプロパティであれば
if(IsAutoInvoker == null || IsAutoInvoker(info.Name)) {
(省略)
Convert(source, info, destination);
}
}
}///
/// 変換処理
///
protected virtual void Convert(S source, PropertyInfo sourceProperty, D destination) {
(変換元と同じ名前のプロパティを変換先から探し、
見つかればプロパティの値を渡す処理)
}
}
変換元、変換先のクラスをジェネリックで定義し、
Convertメソッドを呼び出す。
カスタマイズしたい部分はデリゲートで設定し、
後はDxoTemplateクラスが同じ名前のプロパティどうしの受け渡しを
愚直に行う。それしかやりません。
リスト単位の変換も組み合わせを工夫すれば対応可能でしょう。
もうSeasarである必要すらないのですが、
使い物になるかどうか
ちょっと考えてみたいな〜、と思っています。