1

この質問は、私が持っている別の質問に関連しています。一般的なカスタムコレクションインターフェイスとUnityでiBATIS.NETを使用する

問題は、iBATIS.NETが、インターフェイスではなくカスタムコレクションの具体的なインスタンスである場合にのみ、カスタムコレクション(つまり、Barのカスタムコレクションを持つQueryForObject( "Select_Foo"))にデータを入力することであるようです。これがiBATIS.NETの制限であるかどうか、またはこれを行う方法があるかどうかを誰かが知っていますか?

ありがとう、

ポール

4

1 に答える 1

1

私の理解が正しければ、iBatis がオブジェクトにどのようにマップされるかを完全に制御したいと思うでしょう。

これはITypeHandlerCallbackで行うことができます。詳細については、セクション「3.5.5. カスタム タイプ ハンドラー」のPDF ドキュメントを参照してください。

私は DataTables で似たようなことをしました。実装は次のようになります。

class DataTableBuilder : ITypeHandlerCallback
{
    public object GetResult(IResultGetter getter)
    {
        IDataReader reader = getter.DataReader;

        // (A) define whatever type you want to

        // (B) read rows from DataReader and populate your type from (A)
        while (reader.Read())
        {
            // iterate over the columns of the current row
            for (int i = 0; i < reader.FieldCount; i++)
            {
               // populate your type from (A)
            }                    
        }
        return ...;   // return your type from (A)
    }

    // implement the other members of ITypeHandlerCallback
    // the implementation below actually worked for me
    public object NullValue { get { return null; } }
    public void SetParameter(IParameterSetter setter, object parameter) { }
    public object ValueOf(string s) { return s; }
}

最後の注意: iBatis は、データ転送オブジェクト (DTO) を構築するのに適しています。上記のようなことを試してみると、すでにビジネス オブジェクト アプローチに移行している可能性があります。これは、iBatis では苦痛になる可能性があります。現在(ええと...時間がないため、すでに数か月間)、代替手段としてNHibernateを評価しています。NHibernate は、iBatis よりもはるかにスムーズにビジネス オブジェクト アプローチを処理していると思います。

于 2009-03-30T06:47:11.213 に答える