2011-09-04 34 views
3

我認爲在採訪中提出這個問題有點荒謬。但如果面試官問......需要回答。NHibernate:採訪虛擬和延遲加載深度

深入解釋

  1. 爲什麼屬性和方法必須是虛擬
  2. 裝載如何偷懶工作

問候,

+0

你假裝我們深入解釋,僅僅解釋一點就不夠,那麼如果你覺得自己更像自己呢?或者我應該複製粘貼NH文檔。你的問題聽起來對我來說有點粗魯。 –

+0

NH文檔解釋瞭如何使用NH。我想用這兩個問題想知道幕後發生了什麼。 –

+0

爲什麼你認爲在面試中問這個很荒謬?如果面試官想評估你使用NHibernate的專業水平,爲什麼不呢? –

回答

7

你將不得不看NHibernate的源代碼的更多細節,但我的理解如下:延遲加載是通過用一個類來實現的在運行時生成的代理。代理從類繼承,以便它可以'攔截'方法調用並延遲加載實際數據。只有方法和屬性是虛擬的,這個攔截纔會起作用,因爲客戶端代碼通過對類的引用來調用它們。客戶端代碼可能不知道其really使用代理(從該類派生)的事實。實際延遲加載邏輯是複雜得多,但這大概是怎麼回事:

public class Customer { 
    public virtual String Name { 
     get { return _name; } 
    } 
} 

// code like this gets generated at runtime: 
public class CustomerProxy7461293476123947123 : Customer { 

    private Customer _target; 

    public override String Name { 
     get { 
      if(_target == null){ 
       _target = LoadFromDatabase(); 
      } 
      return _target.Name; 
     } 
    } 
} 

這樣的數據只會得到加載時客戶端實際上所謂的「名」:

Customer customer = Session.Load<Customer>(1); // <-- proxy is returned 
// or 
Customer customer = salesman.FavoriteCustomer; // <-- proxy is returned 

... 

String name = customer.Name; // <-- proxy's Name will be called, loading data 

類似機制用於集合,除了集合不需要在運行時生成。 NHibernate有內置的持久化集合,可以輕鬆加載項目。