如何在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" 这些依赖项进入使用它们的 类。
我再说一遍,这不是我能想到的。它不会编译。这只是为了说明这个概念。
这实际上是 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" 这些依赖项进入使用它们的 类。
我再说一遍,这不是我能想到的。它不会编译。这只是为了说明这个概念。