1
在ASP.NET請求中使用實體管理器的當前建議似乎是將AuthorizedThreadID
屬性設置爲NULL
(參考1和2)。雖然這有效,但似乎正在關閉一個非常重要的「安全網」。雖然我非常努力地以線程安全的方式使用實體管理器,但如果出現錯誤,安全網仍然很好...所以我寧願不必將其設置爲NULL
。在ASP.NET請求中使用實體管理器的更好解決方案?
在ASP.NET世界中,仍然存在大致單一的執行線程 - 只是在執行異步工作時實際線程可能會發生更改。我能想到的幾個可能的解決方案:
- 的
EntityManager.SafeThreadingCheck()
方法做某種額外的魔法來支持ASP.NET請求。我可以理解,IdeaBlade可能不想這樣做......這導致我到第二個選項... EntityManager
提供了一些擴展點,我可以提供我自己的版本SafeThreadingCheck()
我可以在那裏執行特殊的魔法來驗證實體管理器仍然在請求線程上「邏輯上」。我可能不得不在這裏做一些奇怪的事情,但我不認爲這會非常複雜。- 我嘗試使用其他擴展點來檢測何時應該調用我自己的
FancySafeThreadingCheck()
方法。這有不利的一面,我必須試圖將所有必要的位置掛鉤,而現有的SafeThreadingCheck()
方法已經在所有必要的位置被調用(大概是)在正好最好的時間。
我可以理解這可能不是最高優先級的功能請求,但它似乎也可能不太困難(至少對於選項#2)。或者也許還有其他解決方法可能會更好?我的最終目標是避免關閉這個安全檢查......我願意選擇去那裏。
我曾經在過去認爲AuthorizedThreadId邏輯是一個天真的嘗試來強制線程親和力。 EntityManager並不真的需要線程關聯,但確實需要線程安全訪問。我們可以看看選項2 - 也許使方法變得虛擬。 –
謝謝。關於何時可能有更新的任何想法?使方法虛擬可能是最簡單的,但對我們來說不是理想的。我們經常被一個'標準'的EntityManager困住......特別是對於服務器端調用(比如InvokeServerMethod調用) - 在這種情況下,'服務器實體管理器'只是一個香草EntityManager而不是我們從EntityManager繼承的自定義類。相反,如果有事件我們可以訂閱?或者,也許有辦法將自定義委託傳遞給現有的實體管理器? –
自定義委託方法可能是最好的。我們可以在7.2.4版本中找到這個 - 我還沒有這個日期。 –