【问题标题】:How to implement correctly IUserType?如何正确实现 IUserType?
【发布时间】:2014-01-22 22:58:59
【问题描述】:

我需要通过编写一个实现IUserType 的新映射器类来为NHibernate 创建一个custom type。虽然重写大多数方法和属性相对简单,但我很难理解如何正确处理以下成员:

  • object Assemble(object cached, object owner);
  • object DeepCopy(object value);
  • object Disassemble(object value);
  • object Replace(object original, object target, object owner);

我不明白他们的目的究竟是什么;更重要的是,如何正确实施它们。我见过的大多数示例都只是返回原始输入参数。

public object DeepCopy(object value)
{
    return value;
}

public object Replace(object original, object target, object owner)
{
    return original;
}

public object Assemble(object cached, object owner)
{
    return cached;
}

public object Disassemble(object value)
{
    return value;
}

如何在真实案例或更复杂的场景中正确实现这些方法

【问题讨论】:

    标签: c# nhibernate nhibernate-mapping ncommon


    【解决方案1】:

    看看 Ritesh Rao 在他的 NCommon 框架中是如何做到这一点的:

    MoneyUserType 实现了一个名为CompositeUserTypeBase 的基类

    cmets 中有更多细节,但要总结一下:

    • DeepCopy - 应返回持久状态的深层副本,在实体和集合处停止
    • 反汇编 - 将对象转换为其“可缓存”表示(即关联必须作为标识符值缓存)
    • 组装 - 从可缓存的表示中重构对象

    It's explained in a lot more detail here

    【讨论】:

    • 最后的链接指向一篇非常有趣的文章。非常感谢。
    • @md1337 替换为 web.archive
    • Web 存档的链接指向错误的文章 - 这是第一部分,但关于实施 IUserType 的讨论显然在第二部分中,我找不到。
    【解决方案2】:

    您可能想查看此article。这是如何实现 IUserType 接口的一个很好的例子。

    【讨论】:

    猜你喜欢
    • 2015-02-27
    • 2013-07-22
    • 2021-08-17
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多