2013-01-02 66 views
8

我們正在構建的應用程序定期發送不同類型的電子郵件。我將電子郵件模板存儲在Azure Blob存儲中,負責發送電子郵件的方法從該處拖出相應的電子郵件模板。我希望模板不在託管服務之外,以防我想更新它,我只需將新模板上傳到blob即可。PostSharp的免費替代方案

我有,從性能和成本角度看問題,是電子郵件模板很少在24小時內改變。因此,以類似於ASP.NET MVC中的[OutputCache(Duration = duration, VaryByParam = "id")]的方式緩存該方法將成爲增加輔助角色性能的理想解決方案。如何做到這一點現在是一個問題。我瞭解到PostSharp,但我們的預算從一開始就沒有考慮PostSharp的許可費用!

任何其他的替代品?感謝您的幫助。

+0

我可能失去了一些東西,所以我會問:「爲什麼你認爲postsharp會幫助你解決這個問題問題?」 – JerKimball

+0

有一個線程[這裏](http://stackoverflow.com/questions/4929540/is-there-anyway-to-cache-function-method-in-c-sharp)建議PostSharp作爲可行的選項。我搜查了網絡。如果您有其他選擇,將不勝感激。 – olatunjee

+0

好吧,我現在得到了你 - 你想用它作爲AOP;你的緩存邏輯就是你的「橫切關注」。是的,PostSharp可能是一個可行的解決方案。然而,我不知道任何免費軟件的選擇。利梅捅了一下。 – JerKimball

回答

3

PostSharp簡化版是免費的,可以滿足您的要求。

+12

這是在每個項目限制最多10個類之前。 – Carra

0

你有沒有使用local storage resources拉模板出入庫的考慮?您可以配置運行方法RoleEntryPoint的時間間隔。

[更新]

我可能不會在上面已經明確。模板應該存儲在Blob存儲中。本地存儲將用於在服務的每個實例上本地緩存模板的副本。如果您存儲在一個單獨的文件ETag的,這將讓你驗證模板已轉移團塊,即一改之前:

  • welcome.tpl
  • welcome.tag.tpl

在RoleEntryPoint,從* .tag.tpl文件中讀取etag。提交您對Blob存儲與conditional headers請求傳遞的Etag如果 - 無 - 匹配接入條件。如果斑點尚未更新,它會返回一個HTTP 304未修改響應碼,如果它被更新,團塊將被下載。

[/更新]

+0

謝謝。我想當需要更新/更改模板時,如果我們選擇本地存儲,則必須重新部署應用程序。我們正在努力避免這種情況。 – olatunjee

+0

將模板存儲在blob存儲中,但讓RoleEntryPoint使本地存儲中的緩存副本保持最新。只要線程在Run方法中喚醒並且代碼被執行以覆蓋localstorage中的副本,對blob存儲中的模板所做的任何更新都將被更新。 –

1

我已經實現的方法級緩存在過去,使用下列組合:

  1. Autofac作爲IoC容器
  2. Autofac的MVC3 integration
  3. Autofac的DynamicProxy2 (castle)集成攔截支持
  4. 自定義屬性來修飾需要緩存支持的類
  5. 自定義攔截器來添加方法級緩存

自定義屬性和攔截器是很容易設置。我相信,方法級別緩存的主要問題是如何以最優但精確的方式確定緩存命中和丟失。

在我的情況下,它需要的是通用的(支持任何類型的方法調用和參數),所以我不得不創建一個靈活的方式進行哈希以區分不同的呼叫所有方法的參數值。但在你的情況下,這實際上可能是一個非常具體的攔截器,它已經知道你的方法調用的結構,這會使事情變得更容易。

現在關於實際緩存,您可以利用.NET的緩存支持,該緩存支持位於System.Runtime.Caching命名空間中,如果它適合您,它已經提供了MemoryCache

+0

謝謝。檢出它。 – olatunjee

+0

另一種選擇是[NCop](https://github.com/sagifogel/NCop)受postsharp啓發的面向複合方面的框架。 – Sagi

1

我用SNAP幾次。這是免費的,很容易安裝和使用多個IoC容器