2010-05-08 60 views
0

假設我有訂單系統。 每個「訂單」引用「客戶」對象。 當我填寫數據訪問層中的訂單列表時,客戶對象應該從 帶來Customer Web Service「WCF」。 所以,我沒有對顧客財產的次序來映射類映射,獲取Nhibernate實體並從Web服務完成它

 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的會議讓我的訂單列表。 並試圖循環在列表中的每一個訂單,以填補它的客戶財產, doe的任何機構有一個好主意,這?

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

回答

0

所以你說你打了你的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); 

這對於性能老虎鉗。

修改屬性的客戶,因爲這:

,你可以做,是看中了(和不那麼服務表現爲主,但完全一樣的服務表現爲你的樣品)的另一件事

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

如果您訂單應該有一個serviceProxy的引用。

+0

對不起, Dmonlord,感謝您的回覆,第一個解決方案看起來不錯, ,但另一個解決方案,建議該模型應該有一個服務代理,這違反了企業應用程序模式恕我直言:引用意味着模型應該是持久無知的。 我對嗎? – 2010-05-31 17:21:53

+0

好吧,我也會選擇第一個解決方案。我不喜歡像ActiveRecord模式那樣的花哨的東西,當應用程序變得更加複雜時,它可能會在你的腿上拍攝你。我留在服務/存儲庫模式和簡單(或多或少的屬性)域模型。我不在乎是否有人說這不是一個真正的領域驅動設計。 – dmonlord 2010-06-01 17:36:05

0

如果你真的想透明地做到這一點,嘗試實現一個自定義tuplizer(和相關的東西)。看看this article,它爲Java Hibernate實現了一個遠程懶惰加載器,但是由於它具有相同的總體設計(tuplizers,懶惰初始化器,代理工廠等),所以一般概念同樣適用於NHibernate。