代码之家  ›  专栏  ›  技术社区  ›  Aleksandar Vucetic

NHibernate类作为数据合同

  •  8
  • Aleksandar Vucetic  · 技术社区  · 16 年前

    我将通过wcf服务公开一些crud方法,因为一些数据对象通过nhibernate持久化在数据库中。使用nhibernate类作为数据契约是一种好方法,还是包装它们或用其他数据契约替换它们更好?你的方法是什么?

    3 回复  |  直到 16 年前
        1
  •  6
  •   joshua.ewer    16 年前

    我们的团队刚刚花了好几个月的时间来讨论这个设计点,所以我有很多链接要分享;-)

    简短回答: 你“应该”从你的nhibernate类转换成一个域模型。

    长回答: 我认为这个问题的答案是原则性的。如果你 曾经 要实现互操作,您应该 使用数据集作为DTO( I love Hanselman's post on this )我不是说这从来都不是一个好主意,很明显人们已经成功了。只要知道你在偷工减料,这是一个冒险的提议。

    如果您完全控制了将数据推送到的类,那么您可以构建一个很好的域模型,并将NHibernate数据映射到这些类中。您很可能会遇到严重的问题,因为ilist<>(它是一个<bag>映射到的)不可序列化。您必须编写自己的序列化程序,或者使用类似的 NetDataContractSerializer 但是您会失去互操作性。

    您将需要度量构建一些包装类所涉及的工作量,以及它们之间的转换,但是这样您就可以完全灵活地处理域模型的外观。然后,你可以做一些事情(如我们所做的),比如为你的NHibernate地图和对象生成代码。然后,您的数据契约作为数据的抽象,正如它们应该的那样。

    另外,你可能想看看 ADO.NET Data Services 这是一种公开数据的RESTful方法,此时,这似乎是公开数据的最具互操作性的选择。

        2
  •  1
  •   Adam Fyles    16 年前

    您不希望直接公开您的域模型,而是在域到达进程边界时将其映射到某种消息。你可以利用NHibernate为你做映射工作。在这种情况下,您将有两个映射,一个用于域模型,另一个用于轻量消息。

        3
  •  0
  •   Tad Donaghe    16 年前

    我在这方面没有直接的经验,但我以前通过WCF发送过数据集,这很好。我认为在WCF上使用nhibernet作为数据对象的最大问题是缺乏互操作性(在使用数据集时也是如此)。客户不仅必须使用.NET,还必须使用NHibernate。这违背了SOA原则,但是如果您知道 无疑 如果您不打算重用这个组件,那么就没有理由不这样做。

    至少值得一试。