2012-08-11 56 views
3

真的很简单的问题,ASP.MVC应用程序常量,什么是最好的/最优雅的方法?

我只是寻找社区支持什么在结构上最好的作品。

说,以下情况:TempData["MySetting"]?我应该在哪里存储"MySetting"?它应该是

  1. 在不同的类,以便将访问TempData[Config.MySetting];
  2. 在web.config中,这样的访问是TempData[ConfigurationManager.AppSettings["MySetting"];
  3. 内联,把它作为字符串TempData["MySetting"];
  4. 在数据库中的一些常量表
  5. ,使

    var mySetting = (string)_db.GetConstant("MySetting"); 
    TempData[mySetting]; 
    

我不会选择4处理,只是把它针对画面的完整性。 那么你有什么建议和为什么

编辑 问题是相当一般的常量在asp mvc而不是TempData的情况。

谢谢。

回答

2

设置是否更改?取决于你部署的环境?如果是的话,那么你一定要将它们存储在Web.config文件中(如果它不像几个键/值对那么简单,你甚至可以创建一个自定义节)。

如果它们在您使用的所有环境(包括您自己的开发盒,服务器以及您可能想要部署的任何测试/登台机器)上都是相同的,那么我会选择第一个选项:一些常数。

只要将它们存储在数据库中,它确实取决于什么样的设置。如果您希望它们成为您网站的每个用户,那么您最终可能会将它们存储在您的数据库中。或者如果你想能够改变它们(在网站运行时编辑web.config文件不是最好的主意)。

我想尽量不要离开它,因为它是内联的。

+0

你提到的是有道理的。除了1-4之外还有其他选择吗如何创建自定义部分(不知道) - 可以请更新答案?感谢您抽出时间 – 2012-08-11 19:33:17

+0

您可以查看此URL以获取有关如何为您的Web.config创建自定义节的详细说明:http://msdn.microsoft.com/en-us/library/2tw134k3.aspx As far作为其他选择,它实际上取决于你试图存储什么,以及你的具体应用程序。 – 2012-08-11 20:05:35

2

你可以试试这个方法:

public static class Constants 
{ 
     public static class Actions 
     { 
      public const string Administration = "Administration"; 
     } 
} 
3

在您的特定情况下,你应该让周围TempData的包装,这将暴露你的数据属性。所有对TempData的访问应该隐藏在该包装中。在这种情况下,"MySetting"的所有用法将被限制为最多二。如果只有一种用法,则不需要执行任何操作。如果有两个 - 您将"MySetting"定义为private const字段。

简而言之:

public static class TempDataWrapper 
{ 
    private const string _mySettingName = "MySetting"; 

    public int MySetting 
    { 
     get { return (int) TempData[_mySettingName];} 
     set { TempData[_mySettingName] = value;} 
    } 
} 

为了简便起见,我们不与耦合在这里处理(这是紧)和错误处理的缘故(这是没有的)。

+0

谢谢。我的问题相当具体而不是具体。如何处理MVC应用程序内的不同常量? – 2012-08-11 19:48:18

+0

和其他应用程序一样。它们是*常量* - 它们应该是硬编码的。所有其他事情取决于使用情况,*仅限使用情况*。在这个问题上没有一般的方法。 – 2012-08-11 19:56:14

3

我会去的:

public static class Config 
{ 
    public static readonly string MyValue = "SomeValue"; 
} 

更多Const vs Readonly

0

好吧,假设你的常量是真的常数,它们不会在运行时更改。对于这种情况,您可以使用const字段修饰符,在某些情况下使用static readonly修饰符来设置常量值。

public class MyConstants { 
    public const string MyConstantNameValue = "Value"; 
    public const int MyConstantNameValue2 = 123; 

    // prevent the class to be instantiated 
    protected MyConstants() { } 
} 

正如你看到的,你不定义MyConstants作为一个静态类,因为如果你需要另一组常数如特定命名空间(外加全局常量)可以延长常数。

public class MyConstantsPlusSpecificNamespaceConstants : MyConstants { 
    public const string MySpecificConstantName = "Value2"; 
} 
+0

出于同样的原因,您可以将其定义为部分扩展而不需要子类别。谢谢。 – 2012-08-11 21:10:53

+0

如果部分是在同一个程序集中,是的,你可以。 – devundef 2012-08-11 23:52:06

相关问题