2011-04-20 88 views
0

將global.asax(MvcApplication類)掛起共享屬性是否正常?ASP.NET MVC Global.asax共享屬性

,然後訪問它像這樣在其它地區:

MvcApplication.[SharedPropertyName]

編輯

我所試圖做的是有一個全局可訪問的屬性,它是我的應用程序設置。

我正在使用一個XmlSerializer來序列化/反序列化一個對象,它包含所有這些屬性。它很好用,但ApplicationSettings上的Load方法被共享並返回ApplicationSettings的一個實例,所以人們在singelton周圍提出的一些其他想法是行不通的。這裏是ApplicationSettings類:

Public Class ApplicationSettings 

#Region "Members/Properties" 

    Public Property Property1 As String 
    Public Property Property2 As String 
    ... 

#End Region 

#Region "Methods" 

    Public Shared Function GetFilePath() As String 
     Return HttpContext.Current.Server.MapPath("/Bin/Settings.config") 
    End Function 

    Public Shared Function Load() As ApplicationSettings 
     Try 
      Dim Serializer As XmlSerializer 
      Dim Settings As ApplicationSettings 

      Using Reader As New StreamReader(GetFilePath) 
       Serializer = New XmlSerializer(GetType(ApplicationSettings)) 
       Settings = CType(Serializer.Deserialize(Reader), ApplicationSettings) 
       Reader.Close() 
      End Using 

      Return Settings 

     Catch ex As Exception 
      'Return New ApplicationSettings 
      Return Nothing 

     End Try 

    End Function 

    Public Sub Save() 
     Dim Serializer As XmlSerializer 

     Using Writer As New StreamWriter(GetFilePath, False) 
      Serializer = New XmlSerializer(GetType(ApplicationSettings)) 
      Serializer.Serialize(Writer, Me) 
      Writer.Flush() 
      Writer.Close() 
     End Using 

    End Sub 

#End Region 

End Class 
+0

更新我的回答如下。 – 2011-04-20 20:32:57

回答

1

不推薦。如果您需要全局可訪問的變量或屬性,那更適合您的類繼承的基類。

This link給出了一個控制器基類的例子。

編輯:

基於關閉您的編輯,這是艱難的,建議具體,因爲如何將這些設置用於可以驅動你的方法什麼的。這裏有一些一般的提示:

  1. 我會把你的設置分成一系列在他們關心的區域中不同的基類。因此,有關FunctionalityX的設置將存在於處理FunctionalityX的類中。
  2. 我會利用你的web.config。我相信你已經這樣做了,但只要確保你沒有重複配置。 Web.Config是大多數應用程序的正確位置,您可以添加更多內容。爲了將配置信息從web配置中提取出來,類已經存在。

好了,與已經表示,除非這兩個路徑:

  1. 我設置你的類靜態的,所以你可以從任何地方引用您的課,而不會實例是這樣的:ApplicationSettings.SettingValue
  2. 我會有你的ApplicationSettings類的顯式設置屬性,並直接引用它們。如果它們沒有實例化,那麼可以在它們需要時從XML中延遲加載它們。
  3. 我會緩存您的設置,如果他們不動態。

所以有一些一般的提示可能會產生更好的解決方案。沒有關於如何使用的進一步信息,很難推薦具體的東西。

最後編輯:

在下面的評論經過一番討論後,我們發現,在這裏這個資源固定OP的問題:

http://haacked.com/archive/2007/03/12/custom-configuration-sections-in-3-easy-steps.aspx

+0

+1 - 感謝您的鏈接,但請參閱我上面的修改。 – Sam 2011-04-20 20:21:48

+0

我沒有使用web.config,因爲'ConfigurationManager.AppSettings'需要一個字符串作爲鍵名。用我的解決方案,這是所有強類型。在global.asax的Application_Start中,它將這個配置文件讀入'ApplicationSettings',所以它們被緩存以用於應用程序的生命週期。我最初嘗試做的事情是擁有一個類,比如說'AppSettings'具有與'ApplicationSettings'類屬性完全相同的副本,但它們是靜態的,然後使用AutoMapper將從文件加載的ApplicationSettings映射到AppSettings static屬性。有任何想法嗎? – Sam 2011-04-20 20:40:06

+1

嗯,我別無選擇,只能繞過你的問題,而是試着解決你最初導致你誤入歧途的問題!你**可以**以強類型的方式引用你的web.config。這將消除您對此自定義配置實施的需求嗎? http://haacked.com/archive/2007/03/12/custom-configuration-sections-in-3-easy-steps.aspx這個解決方案似乎幾乎是你所得到的。 – 2011-04-20 20:43:45

1

我會說不。有可能有更好的方法來做你想做的事情。