我意识到有一些帖子关于在哪里添加缓存检查/更新以及控制器,模型和缓存代码之间的关注点分离。
我尝试过两个很好的例子但是对MVC不熟悉我不知道哪个是最干净的并且最适合MVC方法?我知道你需要考虑DI和单元测试。
示例1(带代理的Helper方法)
...在控制器中
var myObject = CacheDataHelper.Get(thisID, () =>
WebServiceServiceWrapper.GetMyObjectBythisID(thisID));
控制器
中的示例2(检查模型类中的缓存)var myObject = WebServiceServiceWrapper.GetMyObjectBythisID(thisID));
然后在模特班..............
if (!CacheDataHelper.Get(cachekey, out myObject)) {
//do some repository processing
// Add obect to cache CacheDataHelper.Add(myObject, cachekey);
}
两者都使用静态缓存助手类,但第一个示例使用方法签名,传入的委托方法具有被调用的存储库方法的名称。如果数据不在缓存中,则调用该方法,缓存助手类处理添加或更新当前缓存。
在第二个示例中,缓存检查是存储库方法的一部分,带有额外的行来调用缓存帮助器添加方法来更新当前缓存。
由于我缺乏经验和知识,我不确定哪一个最适合MVC。我喜欢使用委托方法名称调用缓存助手以删除存储库中的任何缓存代码,但我不确定在控制器中使用静态方法是否理想?
第二个示例处理上述内容,但现在缓存检查和存储库查找之间没有分离。也许这不是问题,因为你知道它还需要缓存吗?
答案 0 :(得分:2)
我有一个相当大的项目,我们正在做示例1 - 使用从控制器使用的检索委托来缓存静态类。实际上,在我们的例子中,我们有一个处理缓存的服务类层,控制器引用服务层。服务层处理数据检索,缓存,权限检查等,而控制器主要处理从服务到模型的数据汇总。
根据您的问题,您不一定需要静态缓存助手。您可以使用DI来注入缓存助手的实例,然后您可以将其模拟出来进行测试等。
答案 1 :(得分:1)
我当然不会将缓存代码放在模型中。它没有业务知道Web应用程序的缓存特性。您也不需要在控制器中使用静态实例。您可以通过使CacheHelper成为常规类(可能包含Web缓存)或单例来实现相同的效果并保持可测试性。在任何一种情况下,您都可以使用注入为控制器提供实例。
在没有DI框架的情况下执行此操作的一种简单方法是,如果提供的参数为null,则获取帮助程序实例的构造函数会创建合适的默认值。控制器工厂使用的默认构造函数使用null实例调用此构造函数,因此您将获得默认值。您的测试使用模拟实例调用它,从而保持可测试性。
如果您为助手使用常规类 - 我强烈建议您尝试使其工作 - 您可以使用相同的技术来注入Cache对象。为此它也可以进行测试。