2017-02-17 162 views
1

最初的問題變得多餘,因爲它是基於錯誤的假設,所以它被編輯以提供關於Sessions, Instancing and Concurrency以及下面接受的答案的一些信息。ASP.net實例模式有什麼區別?

+0

請詳細說明。例如,你在談論依賴注入和IoC容器嗎?哪一個......等 – ps2goat

+0

鏈接的文章不包含單詞「靜態」或「AppDomain」。你從哪裏得到這些信息? –

+0

這篇文章的鏈接就是顯示'PerCall'的描述。靜力學分離的事實來自經驗。靜態引用上的'lock'在'Single'模式下工作,但不能在'PerCall'模式下工作。由於觀察CLR性能計數器,「AppDomain」未被創建的假設升級。 –

回答

1

它通常會在各種託管類型中相同:IIS,Windows服務,WCF。

ASP.net如何實現內部工作,使用什麼機制隔離靜態變量,而無需爲每個服務調用創建新的AppDomain。

有一個很好的代碼項目文章,解釋了高層次的差異,如果你想看到底下你應該使用像ILSpy或Reflector這樣的反編譯器來查看實現細節。 實現的不同之處在於,每個請求或每個會話的對象是單例,實例化還是彙集的方式

這裏是代碼項目文章的一個片段:Three ways to do WCF instance management

enter image description here

enter image description here

enter image description here

要設置PerCall的InstanceContext使用ServiceBehaviour屬性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

這裏是服務行爲屬性的源代碼:

https://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/ServiceBehaviorAttribute.cs,b743193260862969,references

具體在那裏建立了instanceModeContext提供者:

dispatch.InstanceContextProvider = InstanceContextProviderBase.GetProviderForMode(this.instanceMode, dispatch); 

if ((this.instanceMode == InstanceContextMode.Single) && 
    (dispatch.SingletonInstanceContext == null)) 
{ 
    if (singleton == null) 
    { 
     if (this.wellKnownSingleton != null) 
     { 
      singleton = new InstanceContext(serviceHostBase, this.wellKnownSingleton, true, false); 
     } 
     else if (this.hiddenSingleton != null) 
     { 
      singleton = new InstanceContext(serviceHostBase, this.hiddenSingleton, false, false); 
     } 
     else 
     { 
      singleton = new InstanceContext(serviceHostBase, false); 
     } 

     singleton.AutoClose = false; 
    } 
    dispatch.SingletonInstanceContext = singleton; 
} 

所以,你可以看到區別是wellKnownSingleton之間的開關,一個hiddenSingleton或者兩者都不是,這是實現對象是單例,實例化或合併的方式。

您可以深入瞭解代碼庫並查看代碼以查看有關實現細節的更多信息。

+0

感謝您的好帖子。正如我在上面的評論中所說的,我們有幾個實例運行在不同的機器上,它讓我在星期五晚上感到恐慌,因爲我的世界裏靜態只能通過創建AppDomain而被隔離^ - ^ –

相關問題