[英]Use static global variable class in ASP.NET MVC web application
我正在创建一个ASP.NET MVC Web应用程序。 它具有执行业务逻辑的服务类,并且它通过实体框架访问数据。
我想基于应用程序变量更改一些业务逻辑。 这些变量是全局变量,它们是从应用程序配置加载的,在初始加载后不会更改。
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
将使应用程序是否以多租户模式运行。
我担心的是:
是否可以使用静态全局变量类来保存这些值?
此应用程序通过负载平衡托管在Azure应用程序服务上。 运行多实例以及重新启动应用程序池时有什么影响?
为了回答您是否可以这样做的问题,我认为这取决于您。
我认为最大的了解是何时刷新该数据。 根据经验,我认为静态信息会存储在应用程序池中,因此,如果重新启动,则将刷新该信息。
考虑一下您需要多少次信息(如果在启动时只需要一次),是否值得将其作为静态信息。 如果您要获取的信息很多(例如,将其存储在数据库中),那么将其存储在诸如静态成员之类的缓存中可能是明智的。
我认为我对静态成员变量的唯一建议是asp是让它们保持简单,布尔值对我来说似乎很好。 请记住,用户确实共享相同的应用程序,这意味着静态变量对于所有用户都是全局的。 如果要使用用户特定的变量,则要使用会话缓存。
永远记住编程中最困难的两件事
尽管这是个玩笑,但它蕴含着许多真相
希望这可以帮助
如果您一次初始化这些值然后仅从它们中读取,则这是线程安全的。 在存在多个工作进程并重新启动时,它也是安全的,因为多个进程不共享变量。
或者,考虑创建一个保存您的设置的类的实例:
class MySettings {
bool IsEnabled;
}
然后,您可以使用依赖注入将此类的单例值注入代码中。 这使得测试更加容易,并使代码更加统一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.