2011-05-13 41 views
2

我有一些功能需要作爲數據庫中某些對象的選項,但每個方法背後的實際代碼太複雜,無法序列化到數據庫中。他們也不能是SQL存儲過程。流利的NHibernate,引用硬編碼的C#方法

所以基本上,我有這些功能的靜態List<T>。有沒有一種標準的方式將它們與我的數據庫中的對象關聯起來?例如..

var functions = new static List<Omega>{ 
new Omega { 
    Id = 1, // this would be useful to a database, but nothing really sets it. 
    Name = "Some Name", // this isn't useful. It's a string literal 
    Function = // this may be a Method, or a Lambda Expression, or something else. 
} 
}; 

class Psi { 
    Guid Id { get; set; } 
    Omega Omega { get; set; } // how can I keep a hard-reference here? 
} 
+0

所以問題是如何堅持從Psi實例到數據庫的歐米茄參考? – 2011-05-14 13:48:59

+0

是的。 「歐米茄」遠非如此複雜,無法連載。但它仍然存在,並被引用。如果可能,我想避免使用「魔術串」。 – Ciel 2011-05-14 16:49:16

+0

歐米茄的所有實例都存儲在一個集合中?此集合是應用程序的全局還是與Psi的特定實例相關?歐米茄的功能可以有任何參數。如果是,那麼委託人是如何被調用的? – 2011-05-14 16:56:17

回答

2

好的,我不知道我是否正確得到它。代表是serializable,因此它們可以存儲在數據庫中,例如, using NH。有一些限制,但序列化代表無論如何都是冒險旅程:)。

如果它不是一個可行的方法,那麼你可以嘗試實現所有的「功能」作爲靜態方法。類和方法名可以存儲在表列中並通過反射調用。

+0

我很難理解這將如何工作。我不完全確定如何將方法調用包裝到可以序列化的委託中。 – Ciel 2011-05-16 14:42:49

+0

這非常整潔,對某些事情非常有用 - 但它並不能真正解決我的問題,因爲所討論的數據太複雜,無法成爲簡單的序列化委託。 – Ciel 2011-05-16 17:54:39

+0

如果您在Omega的「功能」中使用複雜狀態,而「功能」表示複雜算法,那麼可能像Workflow Foundation一樣是您的真正方法。這個框架旨在解決這些問題。無論如何,我很好奇你想達到什麼:)。 – 2011-05-16 19:25:51