1

我只是徘徊,如果它可以使用流利NHibernate自動映射.Net TcpClient對象?流利NHibernate自動映射

我有一個類,我有一個TcpClient屬性,我想映射。

我試着創建一個繼承自TcpClient的自定義類,它叫做tTcpClient,並用getter/setter添加一個Id屬性;但是,它仍在尋找基類的Id字段。

任何人有任何想法,如果有可能,或者我需要創建我自己的TcpClient的XML映射?

我當時希望能夠保存對象,以便在重新加載應用程序時輕鬆地重新創建對象,並將TcpClient對象的屬性綁定到PropertiesGrid並允許通過相當簡單的配置。

謝謝。

回答

2

NHibernate的不知道該如何處理複雜的類型,如TcpClient的開箱即用。但它可以讓你提供自己的加載和存儲代碼。您可以使用IUserType

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映射它:

<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

這看起來不錯,感謝您的幫助。 另一個快速問題?您如何知道發送到字符串[]數組的內容的順序?我意識到你閱讀的屬性,但你怎麼知道地址在位置0和陣列中的位置1的端口? 我問的原因是B/C我試圖實現串行連接相同。 –

1

Nathan,

你看過這個項目嗎?

http://automapper.org/

乾杯

+0

難道這就像流利的自動映射或某事的功能性質? –

+0

我幾乎低估了這是完全偏離主題,但後來意識到你實際上可以使用自動映射器作爲解決這個問題的一部分。我會盡快寫出詳細信息。 –

+0

首先創建一個單獨的類,其中包含所有希望NHibernate保存到數據庫的數據。然後使用AutoMapper(一種將數據從一個對象複製到另一個對象的工具)將值從持久對象移動到TcpClient實例上。 –