.NET ORM 需要虛擬,不能處理密封?
我剛剛開始使用 .NET ORM,甚至還沒有在 Entity Framework 和 NHibernate 之間做出決定。但是在這兩種情況下,我都遇到了一個問題,他們似乎希望我以各種方式損害我的域模型的完整性,尤其是在 C# 對象設計的更精細點上。這是有關該主題的幾個問題之一。
有一個原因
virtual不是 C# 中的方法的預設值。我的領域模型中的對像不準備對子類的行為做出承諾,除非在非常特殊的情況下我將它們標記為此類。換句話說,對於我的域對像上的極少數方法,為未指定的新功能添加一個鉤子是合適的。然而 NHibernate 想要我做所有事情
virtual,而 Entity Framework 想要我做所有的實體引用virtual。我意識到他們為什麼需要它(創建代理對象),並且我意識到這實際上是對繼承的合法使用,並且virtual— 他們實際上是為了添加新功能而連接到我的屬性。但令我感到惱火的是,我必須用完全關於持久性的東西來註釋我的域模型類,而不是表達它們與實現者和消費者的實際契約。作為一個較小的問題,我意識到我可能無能為力,通常
sealed出於所有常見原因用註釋我的類是富有表現力的。不過,這有點不那麼令人討厭,因為為了持久性而從我的域對像中省略註釋似乎沒有添加註釋那麼糟糕。令人沮喪的是,在閱讀了諸如*Effective C#*之類的書籍或 Eric Lippert 之類的部落格(它們為如何設計富有表現力和防彈的 C# 對象提供了很好的建議)之後,使用 ORM 的需要讓我把很多知識拋在了腦後。窗戶。我希望這裡有人能指出我錯在哪裡,無論是在我對他們能力的掌握中,還是在我對域建模和 ORM 角色的思考中。
這不僅僅是 .NET ORM——同樣的約束也適用於 Java ORM。
儘管在 Java 中,除非您明確聲明,否則一切都是虛擬的,因此滿足 ORM 的需求很像您發現的情況
sealed:為了持久性而從我的域對像中省略註釋似乎沒有添加註釋那麼糟糕。
歸結為:持久性無知是一個有價值的目標,但它不是可以 100% 實現的,除非您也願意忽略記憶體負載和性能等次要細節。
如果記憶體負載和性能無關緊要,請停止使用代理並要求所有對像在水合後立即完全填充 - NHibernate 可以通過配置來完成此操作。副作用是所有相關對像都將一次性載入,因此您最終會將大部分數據庫載入到記憶體中。該應用程序將需要大量記憶體並需要大量時間才能啟動 - 但它會起作用。
持久性是一種有漏洞的抽象——雖然您可以將大部分內容隱藏在幕後,但總會有元素洩漏到應用程序的其他區域。