【问题标题】:Any Free Alternative to PostSharp [closed]PostSharp的任何免费替代品[关闭]
【发布时间】:2012-12-16 10:59:04
【问题描述】:

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

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

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

【问题讨论】:

  • 我可能遗漏了什么,所以我会问“为什么你认为 postsharp 会帮助你解决这个问题?”
  • 有一个线程 here 建议 PostSharp 作为可行的选项。我已经在网上搜索过了。如果您有任何其他选择,将不胜感激。
  • 好的,我知道了——你想将它用于 AOP;您的缓存逻辑是您的“横切关注点”。是的,PostSharp 在这里可能是一个可行的解决方案。但是,我不知道有任何免费软件替代品。让我四处看看。
  • 出现好像你可以通过巧妙地使用 Mono.Cecil 来实现相同的最终结果,但我无法确认这一点,因此没有答案 - 但有什么需要调查的?
  • Postsharp 有免费版,你试过吗?

标签: c# asp.net-mvc caching azure


【解决方案1】:

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

【讨论】:

  • 在每个项目限制最多 10 个班级之前。
  • 我正在尝试基于 MrAdvice 创建一个 postsharp 替代方案。也许你可以试一试。您可以使用 MrAdvice.Sharp,请随时向我发送反馈。
  • 记住 fody,最好的开源替代品:github.com/Fody/Fody
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 谢谢。检查出来。
  • 另一种选择是NCop 受postharp启发的面向复合方面的框架。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您是否考虑过使用local storage resources 将模板从存储中拉出?您可以在 RoleEntryPointRun 方法中配置间隔。

    [更新]

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

    • welcome.tpl
    • welcome.tag.tpl

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

    [/更新]

    【讨论】:

    • 谢谢。我想当需要更新/更改模板时,如果我们选择本地存储,我们将不得不重新部署应用程序。我们正在努力避免这种情况。
    • 将模板存储在 blob 存储中,但让 RoleEntryPoint 保持本地存储中的缓存副本为最新。对 blob 存储中的模板所做的任何更新都将在线程在 Run 方法中唤醒并执行代码以覆盖本地存储中的副本时立即更新。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-09-10
        • 2012-03-04
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 2014-04-30
        • 2010-09-09
        相关资源
        最近更新 更多