Dxoの存在意義について考えてみた

前の日記で触れたSeasar.NETの方のS2Dxoの修正は
Java版と.NET版の既存実装の違いなどから
想定していたよりも難しそうなことがわかってきました(^^;


・・・だからと言うわけではないのですが、「Dxo」の存在意義について
改めて考えてみました。
(現実逃避とも言います)


まず、Dxoとは何ぞや?についてはJavaSeasar
このページが参考になると思います。


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である必要すらないのですが、
使い物になるかどうか
ちょっと考えてみたいな〜、と思っています。