2011-07-04 11 views
3

我有一個銀行/集合,它可以緩存內存中對象的實例,以便每個請求都不需要返回到數據存儲區。我希望Autofac提供這個銀行的一個實例,然後在x秒後過期,以便在下一個請求中創建一個新實例。爲了實現這個目標,我無法讓自己的頭腦設置LifetimeScope。我幾次讀過this。世行的目標並不是真正服從於一個工作單位。它理想地位於所有工作單元的「上方」,緩存對象內部和對象之間的對象。創建一個隨時間過期的Autofac Lifetimecope

我目前正在使用下面的方法,但它沒有按照我的希望工作。

有人可以請指出我在正確的方向嗎?

.... 
builder.Register(c => 
      { 
       return new ORMapBank(c.Resolve<IORMapRoot>()); 
      }).InstancePerMatchingLifetimeScope(ExpireTimeTag.Tag()); 


     IContainer container = builder.Build(); 
     var TimedCache= RootScope.BeginLifetimeScope(ExpireTimeTag.Tag()); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(TimedCache)); 

....

public static class ExpireTimeTag 
{ 
    static DateTime d = DateTime.Now; 
    static Object tag = new Object(); 

    public static object Tag() 
    { 
     if (d.AddSeconds(10) < DateTime.Now) 
     { 
      CreateTag(); 
     return tag; 
    } 

    private static void CreateTag() 
    { 
     tag = new Object(); 
    } 
} 

在此先感謝非常多。

回答

6

使用緩存修飾器來實現這種行爲是很常見的。假設你的IORMapRoot負責獲取有問題的數據(但它的工作方式相同,如果ORMapBank)你做到以下幾點:

  • 創建一個新的類型,CachingORMapRoot實現IORMapRoot
  • 添加一個構造函數的到期TimeSpan和原始IORMapRoot實施的一個實例。
  • 實現成員來調用底層實例,然後相應地緩存結果以用於後續調用(實現因緩存技術而異)。
  • 註冊此類型的容器中IORMapRoot

這是爲了實現這樣的高速緩存的非常乾淨的方式。它也使得它很容易switch between cached and non-cached implementations

+0

非常感謝。工作過一種享受。看起來我很偏離軌道。 我現在處於一個可以告別會話狀態的位置!這很重要。我覺得我應該點燃一支蠟燭或一些東西來紀念這一刻:-) –

+0

Hooray!很高興有幫助。下次有人說「DI沒有用處,太複雜了」,你可以告訴他們今天的故事和蠟燭:) *當然,你不需要DI來做到這一點,但它可以很容易地添加交叉 - 當你需要時,像緩存一樣切斷問題。* – bentayloruk

+0

你知道這很有趣。前幾天我們有一家網絡公司在諮詢最佳實踐。公平地說,他們非常好。我很驚訝,儘管領先的技術部門將DI視爲不需要和太複雜。我在當前的項目中幾乎完成了Autofac的實現,並且我必須說我真的很驚訝它只需要很少的代碼。總之,我認爲我只需要10-15行。令人印象深刻的東西:-) –

相關問題