1

Fluent NHibernateを.Net TcpClientオブジェクトの自動マップに使用することができたら、私はたださまよっていましたか?Fluent NHibernate automapping

マップしたいTcpClientプロパティを持つクラスがあります。

tTcpClientという名前のTcpClientを継承し、getter/setterでIdプロパティを追加するカスタムクラスを作成しようとしました。しかし、それはまだ基本クラスのIdフィールドを探していました。

可能であれば、誰でも考えられますか、TcpClient用に独自のxmlマッピングを作成する必要がありますか?

私は、オブジェクトを保存してアプリケーションを再読み込みしたり、TcpClientオブジェクトのプロパティをPropertiesGridにバインドしたり、簡単に設定できるようにすることを望んでいました。

ありがとうございました。

答えて

2

NHibernateのは、箱から出しれるtcpClientのような複雑な型に対処する方法を知りません。しかし、それはあなた自身のロードと格納のコードを提供することができます。

public class TcpClientMapper : IUserType { 

    public SqlType[] SqlTypes { 
     get { 
      return new[] { 
          new SqlType(DbType.String), 
          new SqlType(DbType.Int32) 
         }; 
     } 
    } 

    public Object NullSafeGet(IDataReader rs, String[] names, ...) { 

     String address = NHibernateUtil.String.NullSafeGet(rs, names[0]); 
     Int32 port = NHibernateUtil.Int32.NullSafeGet(rs, names[1]); 

     return new TcpClient(address, port); 
    } 

    public void NullSafeSet(IDbCommand cmd, Object value, Int32 index) { 
     TcpClient tcpClient = value as TcpClient; 
     if(tcpClient == null) { 
      NHibernateUtil.String.NullSafeSet(cmd, null, index); 
      NHibernateUtil.Int32.NullSafeSet(cmd, null, index + 1); 
     } else { 
      EndPoint red = tcpClient.Client.RemoteEndPoint; 
      IPEndPoint endpoint = ((IPEndPoint)red); 
      NHibernateUtil.String.Set(cmd, endpoint.Address.ToString(), index); 
      NHibernateUtil.Int32.Set(cmd, endpoint.Port, index + 1); 
     } 
    } 

    public Type ReturnedType { 
     get { return typeof(TcpClient); } 
    } 

    // TODO: implement other methods 
} 

そしてHBMでこのようにそれをマッピングします:あなたはIUserTypeを使用することができます

<property name="_tcpClient" type="MyNamespace.TcpClientMapper, MyAssembly"> 
    <column name="Address" /> <!-- NullSafeGet/Set index == 0 --> 
    <column name="Port" />  <!-- NullSafeGet/Set index == 1 --> 
</property> 

または流暢UserTypeConventionを使用します。

public class TcpClientUserTypeConvention : UserTypeConvention<TcpClientMapper> { 
} 
+0

私は参照してください。私はIUserTypeのためのすべてのメソッドを実装する必要がありますし、私はそれが動作するために仮定したいと思いますか?もしそうなら、このためにNullSafeSetをどのように実装しますか?私のクラス自体のプロパティは、通常のTcpClient権限のままですか、それをClientMapperクラスに変更する必要がありますか? –

+0

はい、すべてのメソッドを実装する必要があります。難しくありません。答えのリンクを見てください。プロパティは通常のTcpClientのままです(これはデザインの観点からは少し奇妙です)。 NullSafeSet実装の最後の編集を参照してください。 – Dmitry

+0

それは助けてくれてありがとうございます。 別の簡単な質問ですか?どのようにStrings []配列に送られるのかを知っていますか?私はあなたのプロパティを読むことを認識しますが、アドレスが位置0にあり、ポートが配列の位置1にあることをどのように知っていますか? 私が尋ねる理由はb/cです。シリアル接続でも同じことを実装しようとしています。 –

1

ネイサン、

このプロジェクトを見ましたか?

http://automapper.org/

乾杯

+0

これは、Fluentの自動マッピングまたはその何かのように機能することになっています自然? –

+0

私はこれをほぼ完全にオフトピックにしていましたが、この問題の解決の一環としてオートマッパーを実際に使用することができたことに気付きました。私はすぐに詳細を書きます。 –

+0

まず、NHibernateがデータベースに保持するすべてのデータを持つ別のクラスを作成します。次に、AutoMapper(あるオブジェクトから別のオブジェクトへデータをコピーするツール)を使用して、永続オブジェクトからTcpClientインスタンスに値を移動します。 –

関連する問題