2012-08-04 44 views
1

我嘗試使用Between謂詞將當前日期時間與日期時間範圍進行比較。BizTalk業務規則引擎比較日期範圍內的DateTimeNow?

我參考mscorlib組裝和使用get_Now()DateTime類在程序集中獲取DateTimeNow。我有問題比較此當前日期時間與範圍。

我的病情是這樣的:

  • DateTimeNow是2012-08-03 07:00:00之間2012-08-04 07:00:00

  • 在我區DateTimeNow應目前爲2012-08-03 16:33:20。它應該在我指定的範圍之間。但它似乎不起作用。如果我將DateTimeNow替換爲2012-08-03 16:33:20,它可以工作。

這似乎是由於某種原因,我的DateTimeNow不起作用。任何人有任何想法?

回答

2

我發現使用Get_Date()在.NET mscorlib程序彙編功能,您必須修改您的計算機的註冊表

HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\ BusinessRules \ 3.0 \ StaticSupport(DWORD),值給予1

詳細信息:

http://blogs.msdn.com/b/richardbpi/archive/2005/11/14/492489.aspx

http://kinnaribhute.blogspot.co.nz/2008/04/some-interesting-stuff-about-biztalk.html

我不是確定這將如何影響生產服務器,如果生產服務器環境未與多個節點集羣,將會有重新啓動服務器的中斷。

0

事實在引擎中邏輯建模的方式與在.NET代碼中建模對象的方式之間存在阻抗不匹配,其中一個影響是調用靜態方法的問題。如果您按照蕭寒的描述設置了StaticSupport標誌,則引擎會改變其行爲,對靜態方法進行處理,就好像它們是內置函數或謂詞一樣。然而,默認情況下,引擎將靜態方法視爲事實的行爲。在物理上,事實是引擎工作內存中的一個對象,並且在方法可以使用之前,每個事實都必須向引擎聲明。因此,要在DateTime上調用靜態Now屬性獲取器,首先必須將DateTime對象設置爲引擎。當然,DateTime是一個值類型(結構),但這沒關係,因爲當你執行一個規則集時,你將一個事實作爲一個對象或一組事實聲明爲一個對象數組。 .NET會自動將一個DateTime(以內部方式將其包裝爲一個對象)裝箱。

我認識到,爲了調用一個靜態方法(或者,在這種情況下,屬性getter,當然這是一種方法),必須聲明一個對象到引擎,那個對象。如果引擎已經被構建爲默認將靜態方法視爲內置插件,那麼它可能會更好。但是,情況並非如此。另外,如果微軟在單獨的規則集或甚至單個規則的層面上實施了StaticSupport標誌,情況會好得多。在註冊表(機器級)中實現它,或者以這種方式在.config文件(應用程序級;使用)中配置它可能會造成實際問題,因爲它可能會破壞寫入的規則集,以使用相反的旗。

需要牢記的另一點是靜態支持也可以設置爲'2'。在這種情況下,如果您調用不帶參數的靜態方法,或者只使用常量值調用該方法,並且將其作爲條件中的謂詞或另一個函數的參數調用,則引擎將評估靜態成員只需一次並緩存結果。