首页 > 解决方案 > 如果 *not* 依赖注入,是否可以在 ASP.NET Core 中使用 IMemoryCache?

问题描述

所以我需要在我的 ASP.NET Core 应用程序中使用 IMemoryCache,在大多数地方,它被 DI 注入控制器并按预期工作。现在我需要缓存部分菜单,并且菜单逻辑被称为布局视图的一部分。所以,没有控制器可言。我的 Startup 已经包含以下内容,它适用于其他事情:

services.AddMemoryCache();

作为布局一部分的调用如下所示:

@(await new MenuUtility().DisplayNavBar(Html, showMenus))

MenuUtility 类是使用缓存的地方,它的调用如下所示:

public class MenuUtility
{
  private IMemoryCache _cache;

    public MenuUtility()
    {
       _cache = HttpContext.Current.RequestServices.GetService<MemoryCache>();
    }

    // Rest of class logic
}

问题是,我要返回的缓存服务始终为空。有什么我忘记了吗?我试图添加services.AddScoped<MenuUtility>();到 ConfigureServices 调用中,认为这将允许我在构造函数中传递缓存接口,但由于我明确调用 MenuUtility,我没有要传递的缓存参数。

我在这里看到一些关于这个问题的问题,但没有直接和正确地回答它。

因为这是我的项目,我将永远是唯一的程序员,我更喜欢一个简单的解决方案,而不是重新构建一堆它的建议,如果我不能想出一个好的解决方案,我会忽略缓存这个。

标签: c#asp.net-coredependency-injection

解决方案


菜单逻辑被称为布局视图的一部分

您仍然可以@inject在布局 Razor 视图中使用指令将服务注入视图:

@inject MenuUtility menuUtility

@await menuUtility.DisplayNavBar(Html, showMenus)

要使其工作,您只需将 注册MenuUtility为服务,然后在您的中使用构造函数注入MenuUtility来解决IMemoryCache

// in Startup.ConfigureServices
services.AddTransient<MenuUtility>();
public class MenuUtility
{
    private readonly IMemoryCache _cache;

    public MenuUtility(IMemoryCache cache)
    {
       _cache = cache;
    }

    // …
}

您通常应该避免使用new. 您确实对某些框架组件有一些依赖的可能性很高,那么您绝对应该使用依赖注入来自动解决这种依赖关系。

顺便提一句。HttpContext.Current不应在 ASP.NET Core 中编译。如果是这样,您很可能是在System.Web引用的 .NET Framework 上运行。那是与 ASP.NET Core 完全不兼容的旧 ASP.NET。你绝对不应该混合这两个框架。在 ASP.NET Core 中,无法静态检索当前的 HttpContext。您必须在某些时候使用依赖注入。


推荐阅读