我正在创建一个 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 模式下运行。
我的担忧是:
可以使用静态全局变量类来保存这些值吗?
此应用程序托管在具有负载平衡功能的 Azure 应用服务上。运行多实例和应用程序池重启时有什么影响吗?
请您参考如下方法:
要回答您是否“可以”这样做的问题,我认为这取决于您。
我认为最重要的是要知道何时刷新数据。根据经验,我认为静态信息存储在应用程序池中,因此如果重新启动,信息将被刷新。
考虑一下您需要多少次该信息,如果您只在启动时需要它一次,是否值得将其作为静态信息。如果您经常获取该信息(例如,它存储在数据库中),那么将其存储在静态成员等某处的缓存中可能是明智的。
我认为我对静态成员变量的唯一建议是 asp 使它们保持简单, bool 值对我来说似乎很好。请记住,用户确实共享同一个应用程序,这意味着静态变量对所有用户都是全局的。如果你想要一个用户特定的变量,那么你想要使用 session 缓存。
永远记住编程中最难的两件事
- 命名事物
- 缓存失效
- 差一个错误
虽然是个笑话,但里面有很多道理
希望对你有帮助
