1

如果可以使用 Fluent NHibernate 自动映射 .Net TcpClient 对象,我只是在徘徊?

我有一个类,它有一个我想映射的 TcpClient 属性。

我尝试创建一个从名为 tTcpClient 的 TcpClient 继承的自定义类,并添加一个带有 getter/setter 的 Id 属性;但是,它仍在寻找基类的 Id 字段。

如果可能的话,任何人都有任何想法,或者我需要为 TcpClient 创建自己的 xml 映射吗?

我有点希望能够保存对象以便在重新加载应用程序时轻松地重新创建它,并将 TcpClient 对象的属性绑定到 PropertiesGrid 并允许通过这相当容易的方式进行配置。

谢谢。

4

2 回答 2

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> {
}
于 2011-09-09T01:49:57.707 回答
1

弥敦道,

你看过这个项目吗?

http://automapper.org/

干杯

于 2011-09-08T22:07:13.913 回答