如何在asp.net mvc中结合数据库访问和缓存(非静态字段,方法或属性 'Module.dbApp'需要对象引用)

How to combine database access and cache in asp.net mvc (An object reference is required for the non-static field, method, or property 'Module.dbApp')

这实际上是 2 个问题。

我有一个 asp.net mvc 应用程序,我必须在其中加载模块列表,它只是一个带有 ID、模块名称和 class 名称的简单列表,用于在视图中使用字体呈现它太棒了。

我的模型是这样的:

   public class Module
    {
        [Key]
        public int Id { get; set; }
        public string ModuleName { get; set; }
        public string FontAwesomeClass { get; set; }
    }

因为模块列表是一个局部视图,它会在顶部导航栏上呈现一些图标,我不希望每次刷新应用程序时,它都会转到数据库,所以它必须被缓存(我正在使用Azure REDIS 缓存,无论如何与问题无关),所以我不是直接从控制器调用数据库上下文,而是调用缓存 Class 来检查缓存对象是否存在,如果不存在,它将从中检索它数据库,如果有,它将 return 从缓存中取出。

这是我的解决方案结构: http://screencast.com/t/uayPYiHaPCav

这是我的控制器Module.cs

public ActionResult GetModules()
    {
        return View(Cache.Module.GetModules());
    }

如您所见,控制器没有任何从何处获取数据的逻辑。

这里是Module.cs(在缓存命名空间上)

public class Module
    {
        private AppDataContext dbApp = new AppDataContext();

        //Load modules from cache or from database
        public static List<Models.Module> GetModules()
        {
            IDatabase cache = Helper.Connection.GetDatabase();
            List<Models.Module> listOfModules = (List<Models.Module>)cache.Get("Modules");
            if (listOfModules == null)
            {
                return dbApp.ModuleList.ToList();
            }
            else
            {
                return listOfModules;
            }
        }           
    }

这里我有一个编译器错误,我不确定如何最好地修复它:

Error CS0120 An object reference is required for the non-static field, method, or property 'Module.dbApp'

这是我的第一个问题。

第二个问题更多的是关于设计模式的问题,你认为这个正确吗?我试图从缓存中获取数据的方式,它实际上是缓存 class,它检查数据是否在上面或者是否必须转到数据库。

第一个问题:让你的私有成员静态化

private static AppDataContext dbApp = new AppDataContext();

第二个问题:你的缓存策略看起来很标准。唯一的问题是您可能希望缓存数据过期。例如,缓存的数据可能会变旧,并且它在缓存中停留的时间越长,它就会变得越旧。您可能在某个时候想要使其过期并再次获取新数据。

更新:

@EstebanV 代码示例(这是我的头脑,不要假设它编译):

/** 
     ICachedPersonDao abstracts away the caching mechanism 
     away from the core of your application 
**/
public CachedPersonDao : ICachedPersonDao
    {

      private IPersonDao personDao = null;

      public CachedPersonDao(IPersonDao personDao)
      {
          this.personDao = personDao;
      }

      public Person GetPersonById(int id){

          bool isInCache = CACHE.SomeFunctionThatChecksInYourCache(id);
          if (isInCache)
          {
               return CACHE.SomeFunctionThatReturnsTheCachedPerson(id);
          }
          else
          {
               //Well it's not in the cache so let's get it from the DB.
               return this.personDao.GetPersonById(id);
          }
      }
    }

    /** 
       IPersonDao abstracts database communication 
       away from the core of your application 
    **/
    public class PersonDao : IPersonDao
    {
          public Person GetPersonById(int id)
          {
                /** Get the person by id from the DB 
                   through EntityFramework or whatever 
                 **/
          }
    }

用法:

在您的控制器中,如果您想尝试从缓存中获取,请使用 ICachedPersonDao,如果您想不检查缓存而直接从数据库中获取,请使用 IPersonDao

正如我所说,您应该学习依赖注入,它将帮助 "inject" 这些依赖项进入使用它们的 类。

我再说一遍,这不是我能想到的。它不会编译。这只是为了说明这个概念。