关于c#:ASP.NET MVC 4中的全局变量

Global Variables in ASP.NET MVC 4

我目前正在构建一个ASP.NET MVC 4 SaaS应用程序(C),并且一直在设计计划。我的意思是,如果客户选择Plan A,他们应该可以访问一些东西,如果选择Plan B,他们可以访问其他东西,以此类推。

我一直坚持的是将客户计划与所有行动分享的最佳实践。我意识到拥有全局变量是不好的做法,但我真的不想去数据库来回访问,以得到每个行动的计划。

我想做的是这样的事情,所以回答他们只是声明一个静态模型,并在某个点设置它,然后在稍后访问它。在你看来,这是最好的方法吗?有更好的方法吗?


我认为最好的做法是在项目中包含一个IOC,并向控制器注入一个配置对象。

控制器示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class YourController : Controller
 {
     private IConfigService _configService;

     //inject your configuration object here.
     public YourController(IConfigService configService){
           // A guard clause to ensure we have a config object or there is something wrong
           if (configService == null){
               throw new ArgumentNullException("configService");
           }
           _configService = configService;
     }
 }

您可以将IOC配置为为此配置对象指定单例作用域。如果需要将此模式应用于所有控制器,可以创建一个基本控制器类来重用代码。

您的IConfigService

1
2
3
4
public interface IConfigService
{
    string ConfiguredPlan{ get; }
}

您的配置服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ConfigService : IConfigService
{
    private string _ConfiguredPlan = null;

    public string ConfiguredPlan
    {
        get
        {
            if (_ConfiguredPlan == null){
                    //load configured plan from DB
            }
            return _ConfiguredPlan;
        }
    }
}
  • 这个类很容易扩展为包含更多的配置,比如连接字符串、默认超时等等。
  • 我们将一个接口传递给我们的控制器类,在单元测试期间我们很容易模拟这个对象。