我们正在构建的应用程序会定期发送不同类型的电子邮件。我将电子邮件模板存储在Azure blob存储中,负责发送电子邮件的方法从那里提取相应的电子邮件模板。我希望模板在托管服务之外,以防我想要更新它,我只需将新模板上传到blob即可。
从性能和成本角度来看,我遇到的问题是电子邮件模板很少在24小时内发生变化。因此,在ASP.NET MVC中以类似于[OutputCache(Duration = duration, VaryByParam = "id")]
的方式缓存该方法将是一种理想的解决方案,以提高工作者角色的性能。如何做到这一点现在是一个问题。我了解到PostSharp,但我们的预算从一开始就没有考虑PostSharp的许可费用!
还有其他免费替代品吗?谢谢你的帮忙。
答案 0 :(得分:3)
PostSharp Starter Edition是免费的,可以满足您的要求。
答案 1 :(得分:1)
我以前使用以下组合实现了方法级缓存:
自定义属性和拦截器非常容易设置。我相信,方法级缓存的主要问题是如何以最佳但精确的方式确定缓存命中和未命中。
在我的情况下,它需要是通用的(支持任何类型的方法调用和参数),因此我必须创建一种灵活的方法来散列所有方法参数值,以区分一个调用与另一个调用。但在你的情况下,这实际上可能是一个非常具体的拦截器,它已经知道你的方法调用的结构,这将使事情变得更容易。
现在关于实际的缓存,您可以利用.NET System.Runtime.Caching
命名空间中提供的缓存支持,如果适合您,则提供MemoryCache。
答案 2 :(得分:1)
我曾多次使用SNAP。它是免费的,非常容易设置和使用许多IoC容器
答案 3 :(得分:0)
您是否考虑过使用local storage resources将模板从存储中拉出来?您可以在RoleEntryPoint的运行方法中配置间隔。
[更新]
我上面可能不太清楚。模板应存储在Blob存储中。本地存储将用于在每个服务实例上本地缓存模板的副本。如果将ETag存储在单独的文件中,这将允许您在传输blob之前验证模板已更改,即:。
在RoleEntryPoint中,从* .tag.tpl文件中读取etag。使用conditional headers通过 Etag 并使用 If-None-Match 访问条件提交针对Blob存储的请求。如果blob尚未更新,它将返回 HTTP 304 Not Modified 响应代码,如果已更新,则将下载blob。
[/更新]
答案 4 :(得分:0)
如果你只想要AOP功能,你可以使用像Ninject Interception这样的东西。
http://codepyre.com/2010/03/using-ninject-extensions-interception-part-1-the-basics/
答案 5 :(得分:0)
您可以尝试使用KingAOP - 轻松完成此类任务。主要区别在于:
1)在运行时生成代码而不浪费额外的编译时间
2)基于“动态” - 这意味着您的代码将通过官方C#编译器生成。
这是开源项目:https://github.com/AntyaDev/KingAOP
查看文章:
http://www.codeproject.com/Tips/624586/Introducing-the-KingAOP-Framework-Part-1