如何在ASP.NET Core 2.0中设置和访问应用程序范围的变量?
详细信息:
我有一个变量,让我们称之为CompanyName,它存在于数据库中,并且几乎每个页面都使用它。每次我需要显示CompanyName时,我都不想访问数据库。 100年前,我会设置dataset_2
,但我知道这不是在.NET Core中做事的方法。会有什么替代方案?
答案 0 :(得分:9)
在过去的100年中取得了很多进展。前段时间,我相信ASP.NET 1.0,ASP classic中的Application对象被缓存取代(虽然Application对象是为了向后兼容ASP经典而留下的。)
AspNetCore有replaced the caching mechanism of ASP.NET并且它对DI友好,但它仍然非常类似于ASP.NET中的状态。主要区别在于您现在需要注入它而不是使用静态HttpContext.Current.Cache
属性。
在启动时注册缓存...
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvcWithDefaultRoute();
}
}
你可以像......那样注射它。
public class HomeController : Controller
{
private IMemoryCache _cache;
public HomeController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult Index()
{
string companyName = _cache[CacheKeys.CompanyName] as string;
return View();
}
然后,为了使其在应用程序范围内工作,您可以使用filter或middleware结合某种缓存刷新模式:
public string GetCompanyName()
{
string result;
// Look for cache key.
if (!_cache.TryGetValue(CacheKeys.CompanyName, out result))
{
// Key not in cache, so get data.
result = // Lookup data from db
// Set cache options.
var cacheEntryOptions = new MemoryCacheEntryOptions()
// Keep in cache for this time, reset time if accessed.
.SetSlidingExpiration(TimeSpan.FromMinutes(60));
// Save data in cache.
_cache.Set(CacheKeys.CompanyName, result, cacheEntryOptions);
}
return result;
}
当然,您可以清理它并使用强类型属性创建服务作为注入控制器的缓存的包装,但这是一般的想法。
另请注意,如果您想在Web服务器之间共享数据,则会有distributed cache。
您也可以使用静态方法或静态注册的类实例,但请注意,如果在IIS上托管,则每次应用程序池回收>时静态将超出范围。因此,为了实现这一目标,您需要确保使用类似的刷新模式重新填充数据。
主要区别在于缓存有超时设置,可用于优化数据应存储在缓存中的时间(硬限时或滑动到期)。
答案 1 :(得分:4)
您可以创建一个名为ApplicationWideSettings的Singleton类。给该类公共属性。初始化您需要的所有值,然后通过以下方式访问您的类的唯一实例来使用它们:
ApplicationWideSettings.Instance.PropertyName;
当您想要访问它时,请确保引用ApplicationWideSettings类的命名空间。
我更喜欢全局/静态设置,因为您有一个类可以保存所有全局可用数据。
如果你不确定Singleton是什么我可以建议你看看Jon Skeet的这篇文章: