繁体   English   中英

如果*不*注入依赖项,是否可以在 ASP.NET Core 中使用 IMemoryCache?

[英]Possible to use IMemoryCache in ASP.NET Core if it is *not* dependency injected?

所以我需要在我的 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,因此我没有要传入的缓存参数。

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

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

菜单逻辑作为布局视图的一部分被调用

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

@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。 必须在某些时候使用依赖注入。

暂无
暂无

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

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