【问题标题】:Get Nhibernate entity and complete it from a web service获取 Nhibernate 实体并从 Web 服务完成它
【发布时间】:2010-05-08 16:35:43
【问题描述】:

假设我有一个订单系统。 每个“订单”引用一个“客户”对象。 当我在数据访问层填写订单列表时,客户对象应该来自 客户网络服务“WCF”。 所以我没有在 Order 映射类中映射 Customer 属性,

        Id(o => o.OrderID).GeneratedBy.Identity();
        //References(o => o.Customer).Not.Nullable().Column("CustomerID");
        HasMany(o => o.Details).KeyColumn("OrderID").Cascade.AllDeleteOrphan();
        Map(c => c.CustomerID).Not.Nullable();

并要求 nhibernate 会话给我订单列表。 并尝试循环列表中的每个订单以填充其客户财产, 有没有人对此有一个好主意????

 IList<Order> lst = Session.CreateCriteria<Order>().List<Order>();
 foreach (Order order in lst)
                order.Customer = serviceProxy.GetCustomerByID(order.CustomerID);

【问题讨论】:

    标签: wcf nhibernate


    【解决方案1】:

    所以你说你点击了你的 WCF,对于 50、50 次的订单列表。不太好。

    你应该这样做:

       var customers = serviceProxy.GetCustomersForIDs(lst.Select(x => x.CustomerID).Distinct()); //one hit to WCF
    
       foreach(var order in lst)
            order.Customer = customers.Single(x => x.ID == order.CustomerID);
    

    那是为了性能虎钳。

    您可以做的另一件事是花哨的(不是以性能为导向,但与您的示例完全相同):

    将属性 Customer 修改为:

           private customer;
           public virtual Customer
           {
                get
                {
                     if(customer == null)
                         customer = serviceProxy.GetCustomerByID(this.CustomerID);
                     return customer;
                }
            }
    

    您的订单应该在哪里引用 serviceProxy。

    【讨论】:

    • 抱歉来晚了,Dmonlord,谢谢回复,第一个解决方案看起来不错,但是另一个解决方案建议模型应该引用服务代理,这违反了企业应用程序模式恕我直言:这意味着模型应该是持久无知的。我说的对吗?
    • 好吧,我也会选择第一个解决方案。我不喜欢像 ActiveRecord 模式这样的花哨的东西,当应用程序变得更复杂时,它会让你大吃一惊。我坚持服务/存储库模式和简单(或多或少只有属性)域模型。我不在乎有人说那不是真正的领域驱动设计。
    【解决方案2】:

    如果您真的想要透明地执行此操作,请尝试实现自定义 tuplizer(和相关的东西)。看看this article,它为 Java Hibernate 实现了一个远程延迟加载器,但是一般概念同样适用于 NHibernate,因为它具有相同的整体设计(tuplizers、延迟初始化器、代理工厂等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多