請你給一個簡單的NHibernate'代理'的定義。你能解釋一下NHibernate的「代理」基本上是什麼意思?
作爲一個例子,這是從曼寧Nhibernate的行動書引文:
「對於一個或 關聯,延遲抓取能夠 僅當關聯的類映射 使代理」。
請你給一個簡單的NHibernate'代理'的定義。你能解釋一下NHibernate的「代理」基本上是什麼意思?
作爲一個例子,這是從曼寧Nhibernate的行動書引文:
「對於一個或 關聯,延遲抓取能夠 僅當關聯的類映射 使代理」。
這意味着它將創建一個繼承原始實體的類,並覆蓋將代表關聯類的實際屬性。通過這種方式,它可以實現從DB獲取數據以實現懶惰的邏輯,而不是始終具有可用的數據。
對於集合,雖然這是在ISet和IList等NHibernate版本中實現的。這隻與多對一或一對一的關係有關。
例子:
public class YourEntity {
public virtual OtherEntity Entity { get; set; }
}
public class DynamicProxyEntity : YourEntity {
private OtherEntity entity;
public override OtherEntity Entity {
get { return entity = LoadFromDb(); }
set { this.entity = value; }
}
}
這是它的一個非常簡單的版本,希望這會給你它是如何工作的洞察力。這當然會給你的應用帶來問題,因爲你沒有實際的實體類型的實例,但是派生的實例。如果您使用屬性等來修飾類,那些可能不會被識別(取決於您的代碼)。如果你不小心,類型檢查等也會中斷。
當你有一個惰性關聯時,NHibernate需要知道何時指向該關聯的屬性被代碼請求以便命中數據庫並獲取合適的實體。這是通過「代理」你的班級完成的,這意味着從你的班級派生出來並覆蓋屬性的獲取和設置。這是實體類需要具有公共屬性virtual
的原因,因此它們可以在生成的派生(代理)類中重載。代理由配置中指定的代理工廠自動創建。
它使用CodeDom來實現這個嗎? – pencilCake
我對內部工作不熟悉,但我認爲它使用Castle.DynamicProxy2(http://www.castleproject.org/dynamicproxy/index.html),您可以查看它的源代碼。 – jishi