2010-08-12 58 views
2

如何將C#方法存儲在sql服務器實例中以便在以後加載並在運行時動態運行?C#中動態方法的數據庫存儲

我即將在工作中開始一個生產測試項目,我希望在運行時加載產品的相應測試方法。

我已經看過Reflection.Emit DynamicMethod,但它不是可序列化的。

任何建議或替代路線將不勝感激。

+0

聽起來很有趣...爲什麼你要存儲C# DB中的方法? – 2010-08-12 10:06:01

+0

我們正在推出我們的第一款產品,我希望測試系統儘可能通用。 擁有一個非常簡單/通用的主機應用程序似乎是個不錯的主意,它可以動態加載和運行特定於被測產品的適當測試方法。 運營商只需要輸入產品的ID號碼並點擊開始! – Lewray 2010-08-12 10:14:37

回答

0

序列化類不會對它進行序列化的任何代碼進行序列化,並在反序列化時將該數據重新加載到類的屬性中。類的任何方法都與剛剛手動實例化類相同。試圖將實際的代碼串行化到數據庫,然後以某種方式將它編譯成運行時的方法,這是一件非常奇怪和奇特的事情,我正努力去理解它在測試環境中的用處。如果你真的想將源代碼存儲在數據庫中,最好將它作爲文本存儲起來,然後將其編譯爲文本文件,然後編程編譯它。然而,這就是Subversion和Nant的源代碼控制和構建系統,所以你可以說是重新發明了輪子。

除了最後一條評論,我認爲你需要的一個好的模式是dependency injection。你創建一個界面(例如ITester)來定義一個測試的合同,一個簡單的界面就是一個測試方法,它返回一個布爾值來通過和失敗。你正常編寫測試程序,但是你的測試方法需要一個實現ITest接口的類。實現ITester接口的類負責具體的測試實現並實際執行測試。系統的其餘部分不關心測試是什麼或者如何執行,它只是運行一個返回true或false的測試方法。

這樣,您只需創建一個新的測試實現就可以創建一個實現ITester的新類。如果您需要更改測試實施,則只需更改特定的類並重新部署即可。如果您將每個測試程序類編譯爲它自己的DLL,則可以將它們作爲二進制數據存儲在數據庫中。然後您可以從數據庫中提取它們並使用System.Reflection.Assembly.Load動態加載它們。請注意,這不是序列化,而是將二進制程序集文件存儲在數據庫中。

你最終得到的是一個系統,它決定它需要運行哪些測試,查詢數據庫中可以運行測試代碼的相關DLL文件,然後在運行時動態加載並執行DLL。

+0

謝謝你的回答。 我明白,當序列化一個對象時,源代碼不會存儲在數據庫中,而是在尋找執行該任務的方法時,我遇到了動態方法類(我在專業軟件開發中相當新穎),並認爲DynamicMethod(作爲對象本身)可能以某種方式以可序列化的方式存儲。 – Lewray 2010-08-12 10:18:37

+0

我的觀點並非如此,以至於在序列化一個對象時,源代碼不會被存儲在數據庫中,而是存儲更多的NO代碼。 Serlialising只是簡單地存儲數據,並依靠實際編譯的類來反序列化。話雖如此,我可以看到你對DynamicMethod意味着什麼,因爲數據就是代碼。即使你cou ser ser it it it it it i i i i i how how how how how how how how你究竟想要達到什麼目的,因爲你的描述聽起來像是想要做的事情。 – 2010-08-12 10:43:29

+0

這是我的想法 - 代碼是DynamicMethod中的數據。 未來的方案是(希望)數百種不同的電子產品需要大量測試才能運行,這些測試針對的是用於構建它們的硬件組件。 操作員將產品部件號輸入產品測試應用程序,並且加載並運行與該產品上特定硬件配置相關的所有測試。 – Lewray 2010-08-12 10:52:24

0

出於興趣,如果使用Expression <>爲你的方法樹,有在旅途連載這些項目 - 看SO發佈here

相關問題