使用 nHibernate 和 Json.Net 公开部分对象

Exposing partial objects with nHibernate and Json.Net

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

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

  1. 修改序列化 - 所以从 nHibernate 加载完整对象 但要有一个策略来确定要显示的属性。我有 尝试自定义 JsonNet 的序列化失败,因此 它尊重对象是否被转换为接口(即。 ICustomerReference) 或基数 class ( 这样完整的 'Customer' 继承自 越简单的 'CustomerReference' class)
  2. 修改数据模型,进而修改nHibernate模型,使其遵循后一种思路 上面提到过,其中完整的 'Customer' class 继承自更简单的 'CustomerReference' class。还 不成功,因为 nHibernate 会给我完整的对象,即使我要求它 load/get 'CustomerReference' class.

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

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

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

如果您还想显示每个客户的订单数量之类的东西,这可能会很有用,这需要使用子查询,并且使用实体来填充这样的 table 最终会执行太多性能较低的查询。