繁体   English   中英

ASP.NET Core 2.0中的应用程序变量

[英]Application Variables in ASP.NET Core 2.0

我如何在ASP.NET Core 2.0中设置和访问应用程序范围的变量?

细节:我有一个变量,我们称之为CompanyName,它存在于数据库中,并且几乎每个页面都使用它。 每次我需要显示CompanyName时,我都不想访问数据库。 100年前,我会设置Application["CompanyName']=CompanyName但我知道这不是在.NET Core中做事的方法。可以选择什么?

在过去的100年中取得了很大进展。 前段时间,我相信ASP.NET 1.0,ASP经典中的Application对象被取代了缓存 (尽管Application对象是为了向后兼容ASP经典而留下的)。

AspNetCore 取代了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();
    }

然后,为了使它在应用程序范围内工作,您可以使用过滤器中间件与某种缓存刷新模式相结合:

  1. 尝试从缓存中获取值
  2. 如果尝试失败
    • 从数据库中查找数据
    • 重新填充缓存
  3. 返回值

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服务器之间共享数据,则需要使用分布式缓存

您也可以使用静态方法或静态注册的类实例,但请注意,如果在IIS上托管, 每次应用程序池回收时静态都将超出范围 因此,为了实现这一目标,您需要确保使用类似的刷新模式重新填充数据。

主要区别在于,使用缓存时,可以使用超时设置来优化数据应存储在缓存中的时间(硬时间限制或滑动到期时间)。

您可以创建一个名为ApplicationWideSettings的Singleton类。 给该类公共属性。 初始化您需要的所有值,然后通过以下方式访问您的类的唯一实例来使用它们:

ApplicationWideSettings.Instance.PropertyName;

只需确保在要访问它时引用ApplicationWideSettings类的名称空间。

我更喜欢全局/静态设置,因为您有一个类可以保存所有全局可用数据。

如果你不确定Singleton是什么我可以建议你看看Jon Skeet的这篇文章:

C#深度:在C#中实现单例模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM