在ASP.NET MVC Web应用程序中使用静态全局变量类

时间:2018-01-27 10:38:54

标签: c# asp.net asp.net-mvc azure azure-web-app-service

我正在创建一个ASP.NET MVC Web应用程序。它具有执行业务逻辑的服务类,并通过Entity Framework访问数据。

我想根据应用程序变量更改一些业务逻辑。这些变量是全局变量,从app config加载,在初始加载后不会更改。

public class BroadcastService : IBroadcastService
{
    private static readonly ILog Logger = LogProvider.GetCurrentLogger();
    private readonly IUnitOfWork _worker;
    private readonly IGlobalService _globalService;

    public BroadcastService(IUnitOfWork worker, IGlobalService globalService)
    {
      _worker = worker;
      _globalService = globalService;
    }

    public IEnumerable<ListItemModel> GetBroadcastGroups()
    {
       if(Global.EnableMultiTenant)
       {
          //load data for all tenants
       }
       else
       {
           //load data for current tenant only
       }

       return broadcastGroups ?? new List<ListItemModel>();
    }

    ...
}

public static class Global
{
    public static bool EnableMultiTenant{get;set;}
}

例如,EnableMultiTenant将保持应用程序以多租户模式运行。

我担心的是:

  1. 使用静态全局变量类来保存​​这些值是否可以?

  2. 此应用程序托管在具有负载平衡的Azure应用服务上。运行多实例和应用程序池重启时有效吗?

2 个答案:

答案 0 :(得分:3)

回答你的问题是否可以“好”。要做到这一点,我认为这取决于你。

我认为最重要的是要知道数据何时会被刷新。根据经验,我认为静态信息存储在应用程序池中,因此如果重新启动,则会刷新信息。

  

Lifetime of ASP.NET Static Variable

考虑您需要多少次这些信息,如果您在启动时只需要它一次,是否值得将其作为静态信息。如果您正在获取该信息(例如,它存储在数据库中),那么将其存储在某个地方的缓存中可能是明智的,例如静态成员。

我认为我唯一建议使用静态成员变量是asp,让它们变得简单,booleans对我来说似乎很好。请记住,用户确实共享相同的应用程序,这意味着静态变量对所有用户都是全局的如果您需要特定于用户的变量,那么您希望使用会话缓存。

永远记住编程中最难的两件事

  1. 命名事物
  2. 缓存失效
  3. 关闭一个错误
  4.   

    https://martinfowler.com/bliki/TwoHardThings.html

    虽然这是个玩笑,但它有很多道理

    希望这有帮助

答案 1 :(得分:2)

如果您初始化这些值一次然后只读取它们,这是线程安全的。由于多个进程不共享变量,因此在存在多个工作进程和重新启动时也是安全的。

另外,考虑创建一个包含设置的类的实例:

class MySettings {
 bool IsEnabled;
}

然后,您可以使用依赖项注入将此类的单例值注入代码。这使得测试更容易,并使代码更加统一。