15

我们正在构建的应用程序会定期发送不同类型的电子邮件。我将电子邮件模板存储在 Azure blob 存储中,负责发送电子邮件的方法从那里提取适当的电子邮件模板。如果我想更新它,我希望模板位于托管服务之外,我可以通过将新模板上传到 blob 来做到这一点。

从性能和成本的角度来看,我遇到的问题是电子邮件模板很少在 24 小时内更改。因此,以类似于 [OutputCache(Duration = duration, VaryByParam = "id")]ASP.NET MVC 的方式缓存该方法将是提高辅助角色性能的理想解决方案。如何做到这一点现在是一个问题。我了解了PostSharp,但我们的预算从一开始就没有考虑 PostSharp 的许可费!

还有其他免费的替代品吗?感谢您的帮助。

4

6 回答 6

3

PostSharp Starter Edition 是免费的,可以满足您的要求。

于 2013-01-03T09:15:43.940 回答
2

我过去使用以下组合实现了方法级缓存:

  1. Autofac作为 IoC 容器
  2. Autofac 的MVC3 集成
  3. 用于拦截支持的 Autofac 的 DynamicProxy2 (castle)集成
  4. 自定义属性来装饰需要缓存支持的类
  5. 自定义拦截器以添加方法级缓存

自定义属性和拦截器很容易设置。我相信,方法级缓存的主要问题是如何以最佳但精确的方式确定缓存命中和未命中。

在我的情况下,它需要是通用的(支持任何类型的方法调用和参数),所以我必须创建一种灵活的方法来散列所有方法参数值,以便区分一个调用和另一个调用。但是在您的情况下,这实际上可能是一个非常具体的拦截器,它已经知道您的方法调用的结构,这将使事情变得容易得多。

现在关于实际缓存,您可以利用命名空间中提供的 .NET 缓存支持,如果适合您System.Runtime.Caching,它已经提供了MemoryCache 。

于 2013-01-02T05:04:39.233 回答
1

我用过几次SNAP 。它是免费的,并且非常容易设置和使用许多 IoC 容器

于 2013-01-02T07:23:07.707 回答
0

您是否考虑过使用本地存储资源将模板从存储中拉出?您可以在RoleEntryPoint的Run方法中配置间隔。

[更新]

上面我可能没有说清楚。模板应存储在 Blob 存储中。本地存储将用于在服务的每个实例上本地缓存模板的副本。如果您将 ETag 存储在单独的文件中,这将允许您在传输 blob 之前验证模板已更改,即:

  • 欢迎.tpl
  • 欢迎.tag.tpl

在 RoleEntryPoint 中,从 *.tag.tpl 文件中读取 etag。使用条件标头提交针对 blob 存储的请求,并通过If-None-Match访问条件传递Etag 。如果 blob 尚未更新,它将返回HTTP 304 Not Modified响应代码,如果已更新,则将下载 blob。

[/更新]

于 2013-01-02T01:44:27.640 回答
0

如果你只想要 AOP 功能,你可以使用 Ninject Interception 之类的东西。

http://codepyre.com/2010/03/using-ninject-extensions-interception-part-1-the-basics/

于 2013-01-03T09:19:28.267 回答
0

您可以尝试使用 KingAOP - 轻松完成此类任务。主要区别在于:
1)在运行时生成代码而不浪费额外的编译时间。
2) 基于“动态” - 这意味着您的代码将通过官方 C# 编译器生成。

开源项目:https ://github.com/AntyaDev/KingAOP

看看文章: http:
//www.codeproject.com/Tips/624586/Introducing-the-KingAOP-Framework-Part-1

于 2013-12-13T12:04:10.100 回答