Skip to main content
 首页 » 编程设计

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

2024年01月29日24dudu

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

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

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 将保持应用程序是否在 Multi-Tenancy 模式下运行。

我的担忧是:

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

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

请您参考如下方法:

要回答您是否“可以”这样做的问题,我认为这取决于您。

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

Lifetime of ASP.NET Static Variable

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

我认为我对静态成员变量的唯一建议是 asp 使它们保持简单, bool 值对我来说似乎很好。请记住,用户确实共享同一个应用程序,这意味着静态变量对所有用户都是全局的。如果你想要一个用户特定的变量,那么你想要使用 session 缓存。

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

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

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

虽然是个笑话,但里面有很多道理

希望对你有帮助