Domanda

Stavo solo vagando se fosse possibile utilizzare il fluente nhibernate per mappare automaticamente un oggetto .net tcpclient?

Ho una classe che ha una proprietà TCPClient che vorrei mappare.

Ho provato a creare una classe personalizzata che eredita da TCPClient chiamata TTCPClient e aggiungendo una proprietà ID con un getter/setter; Tuttavia, stava ancora cercando il campo ID per la classe base.

Qualcuno ha qualche idea se è possibile o dovrò creare la mia mappatura XML per TCPClient?

Speravo in qualche modo di essere in grado di salvare l'oggetto per ricrearlo facilmente nel ricaricare l'applicazione e per legare le proprietà dell'oggetto TCPClient a PropertiesGrid e consentire la configurazione attraverso quella piuttosto facile.

Grazie.

È stato utile?

Soluzione

Nhibernate non sa come gestire tipi complessi come TCPClient fuori dalla scatola. Ma ti consente di fornire il tuo codice di caricamento e archiviazione. Puoi usare 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
}

E mapparlo così in HBM:

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

O usare fluente UserTypeConvenzione:

public class TcpClientUserTypeConvention : UserTypeConvention<TcpClientMapper> {
}

Altri suggerimenti

Nathan,

Hai dato un'occhiata a questo progetto?

http://automapper.org/

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top