Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用nHibernate和Json.Net公开部分对象_C#_Nhibernate_Json.net_Nancy - Fatal编程技术网

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

C# 使用nHibernate和Json.Net公开部分对象,c#,nhibernate,json.net,nancy,C#,Nhibernate,Json.net,Nancy,我正在开发一个基于Nancy和nHibernate的RESTAPI。与大多数REST API一样,我想限制当资源显示为集合的一部分(/customers)时显示的属性数量,而不是将其显示为资源(customers/1)时显示的属性数量 很明显,我可以把东西拼凑在一起,来回映射,但我正在寻找最通用的解决方案。我看到两种策略: 修改序列化-以便从nHibernate加载完整对象 但是要有一个策略来决定要显示哪些属性。我有 尝试自定义JsonNet so的序列化失败 如果对象被强制转换到接口(即。 I

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

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

  • 修改序列化-以便从nHibernate加载完整对象 但是要有一个策略来决定要显示哪些属性。我有 尝试自定义JsonNet so的序列化失败 如果对象被强制转换到接口(即。 ICCustomerReference)或基类(以便完整的“Customer”继承自 更简单的“CustomerReference”类)
  • 修改数据模型,从而修改nHibernate模型,使其遵循后一种思想 如上所述,其中完整的“Customer”类继承自更简单的“CustomerReference”类。阿尔索 失败,因为nHibernate将给我完整的对象,即使我要求它加载/获取“CustomerReference”类

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

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

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

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


    如果您还想显示每个客户机的订单数量,这可能会很有用,因为这需要使用子查询,而使用实体填充此类表最终会执行太多性能较低的查询。

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


    如果您还想显示每个客户机的订单数量,这可能会很有用,因为这需要使用子查询,而使用实体填充此类表最终会执行太多性能较低的查询。

    我希望尽可能以本机方式执行,这样就不必查询了。我会的gh承认,对于一个本质上有多个结果的集合来说,查询就是一个结果。但是,投影也可以应用于属性吗?lite对象的第二个用法通常是一个嵌套类,用作完全加载对象的引用。例如,订单上的一个嵌套客户对象。我希望尽可能以本机方式进行,以便查询是不必要的。不过,我同意,对于一个本质上有多个结果的集合来说,查询就是一种查询。但是,投影也可以应用于属性吗?lite对象的第二种用法通常是一个嵌套类,用作完全加载对象的引用。例如,订单上的一个嵌套客户对象。您有吗要求将客户引用持久化回数据库?还是仅用于显示目的?显然,如果在创建订单时可以放置客户,我将是一个不错的功能。但现在,绝对没有。您是否要求将客户引用持久化回数据库?还是仅用于显示目的?显然,我会这是一个很好的功能,如果在创建订单时可以放置客户。但是现在,绝对不行。