【问题标题】:Exposing partial objects with nHibernate and Json.Net使用 nHibernate 和 Json.Net 暴露部分对象
【发布时间】:2015-04-07 19:20:41
【问题描述】:

我正在开发一个基于 Nancy 和 nHibernate 的 REST API。与大多数 REST API 一样,我想限制当资源显示为集合 (/customers) 的一部分时显示的属性数量与显示为资源 (customers/1) 时显示的属性数量相比。

显然,我可以在来回映射东西的地方拼凑一些东西,但我正在寻找最通用的解决方案。我看到了两种策略:

  1. 修改序列化 - 所以从 nHibernate 加载完整的对象 但有一个确定要显示哪些属性的策略。我有 未成功尝试自定义 JsonNet 的序列化所以 它尊重对象是否被转换为接口(即。 ICustomerReference)或基类(以便完整的“客户”继承自 更简单的“CustomerReference”类)
  2. 修改数据模型和 nHibernate 模型,使其遵循后一种想法 上面提到,完整的“客户”类继承自更简单的“客户参考”类。还 不成功,因为 nHibernate 会给我完整的对象,即使我要求它加载/获取“CustomerReference”类。

如果我需要澄清任何事情,请告诉我。

【问题讨论】:

  • 您是否需要将客户参考资料持久化回数据库?还是仅用于展示目的?
  • 显然,如果客户可以在创建订单时被 PUT,我将是一个不错的功能。但就目前而言,绝对没有。

标签: c# nhibernate json.net nancy


【解决方案1】:

这是一个仅显示的视图,对于那些最可能的方法是使用 DTO 对象(类似于 CustomerListRowDTO)并通过查询填充它(如果是 NHibernate,它将类似于 HQL 或 QueryOver)

如果您还想显示每个客户端的订单数之类的信息,这可能会很有用,这需要使用子查询,并且使用实体来填充此类表最终会导致执行过多的性能较低的查询。

【讨论】:

    【解决方案2】:

    您可以通过为您想要公开的每个类创建一个“Lite”版本来改进第二种方法(正如您所说的 - 参考)。 为了不从表中获取完整的对象,您应该使用 NHibernate Projections。 Projections 的主要用途之一是帮助您将完整映射限制为特定属性(您可以进行其他操作,例如不同的聚合)。 您可以动态控制 Projections,但它需要构建某种机制来选择在每次调用中获取的属性。 Projections 的另一个主要优点是您可以展平对象。如果对象是具有集合和复杂元素作为属性的复杂对象,您几乎可以将任何东西投影到一个平面对象。

    【讨论】:

    • 我希望尽可能在本地进行,这样就不需要查询了。我会接受对于本质上具有多个结果的集合是查询。但是预测也可以应用于房产吗? lite 对象的第二种用法通常是嵌套类,用作完全加载对象的引用。 IE。订单上的嵌套客户对象。
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多