C# 如果没有注入依赖项,是否可以在Asp.Net内核中使用IMemoryCache?

C# 如果没有注入依赖项,是否可以在Asp.Net内核中使用IMemoryCache?,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,因此,我需要在我的Asp.Net核心应用程序中使用IMemoryCache,在大多数情况下,它会被分配到控制器中,并按预期工作。现在我需要缓存部分菜单,菜单逻辑被称为布局视图的一部分。所以,这里没有一个控制器。我的初创公司已经具备了以下功能,在其他方面也很有效: services.AddMemoryCache(); 作为布局一部分的调用如下所示: @(await new MenuUtility().DisplayNavBar(Html, showMenus)) public class Me

因此,我需要在我的Asp.Net核心应用程序中使用IMemoryCache,在大多数情况下,它会被分配到控制器中,并按预期工作。现在我需要缓存部分菜单,菜单逻辑被称为布局视图的一部分。所以,这里没有一个控制器。我的初创公司已经具备了以下功能,在其他方面也很有效:

services.AddMemoryCache();
作为布局一部分的调用如下所示:

@(await new MenuUtility().DisplayNavBar(Html, showMenus))
public class MenuUtility
{
  private IMemoryCache _cache;

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

    // Rest of class logic
}
MenuUutility类(将在其中使用缓存)具有如下调用:

@(await new MenuUtility().DisplayNavBar(Html, showMenus))
public class MenuUtility
{
  private IMemoryCache _cache;

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

    // Rest of class logic
}
公共类菜单实用性
{
私有IMemoryCache\u缓存;
公共功能()
{
_cache=HttpContext.Current.RequestServices.GetService();
}
//剩余类逻辑
}
问题是,我希望返回的缓存服务总是空的。有什么我忘了的吗?我试图添加
服务。addScope()
调用ConfigureServices,认为这将允许我在构造函数中传递缓存接口,但由于我显式调用MenuUtility,因此没有要传递的缓存参数

我在这里看到了一些问题,以便围绕这个问题进行讨论,但没有任何直接和正确的答案

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

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

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

@inject MenuUtility menuUtility

@await menuUtility.DisplayNavBar(Html, showMenus)
要实现这一点,您只需将
MenuUtility
注册为服务,然后在
MenuUtility
中使用构造函数注入来解析
IMemoryCache

// in Startup.ConfigureServices
services.AddTransient<MenuUtility>();
通常应避免使用
new
创建实用程序和服务。很有可能您确实对某个框架组件有一些依赖关系,然后您肯定应该使用依赖关系注入来自动解决这个依赖关系

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

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

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

@inject MenuUtility menuUtility

@await menuUtility.DisplayNavBar(Html, showMenus)
要实现这一点,您只需将
MenuUtility
注册为服务,然后在
MenuUtility
中使用构造函数注入来解析
IMemoryCache

// in Startup.ConfigureServices
services.AddTransient<MenuUtility>();
通常应避免使用
new
创建实用程序和服务。很有可能您确实对某个框架组件有一些依赖关系,然后您肯定应该使用依赖关系注入来自动解决这个依赖关系


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

您尝试过吗,var x=new MemoryCache();您是否尝试过,var x=new MemoryCache();谢谢这正好解决了问题!关于框架版本,向上投票并标记为answer.BTW,看起来像是我在某个地方手动引用了System.Web(用于获取IP地址),所以这可能就是上面的相关行没有引起编译器抱怨的原因。但在参考资料中没有看到。我会解决的,谢谢!这正好解决了问题!关于框架版本,向上投票并标记为answer.BTW,看起来像是我在某个地方手动引用了System.Web(用于获取IP地址),所以这可能就是上面的相关行没有引起编译器抱怨的原因。但在参考资料中没有看到。我去解决这个问题。