c# - 如果 *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,我没有要传递的缓存参数。
我在这里看到一些关于这个问题的问题,但没有直接和正确地回答它。
因为这是我的项目,我将永远是唯一的程序员,我更喜欢一个简单的解决方案,而不是重新构建一堆它的建议,如果我不能想出一个好的解决方案,我会忽略缓存这个。
解决方案
菜单逻辑被称为布局视图的一部分
您仍然可以@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。您必须在某些时候使用依赖注入。
推荐阅读
- angular - 使用自定义 uploadHandler 时 PrimeNG 文件上传进度不更新
- javascript - jQuery FlipClock TwentyFourHourClock 显示完整日期
- python - 在 chromebook 上获取 bs4
- java - Spring Boot - 身份验证为空
- python - 如何将嵌套字典转换为数据框,而不将内部键转换为列
- java - 比较java中的两个大列表
- python - 用新数据框附加数据框
- javascript - 如何获取数据并存储在 React Context API 中?
- node.js - Socket IO 3.0,不在服务器上接收发射
- javascript - 表单提交上的进度条渲染 | 完成数据响应