2011-04-20 85 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

我会说不。有可能有更好的方法来做你想做的事情。