2014-02-11 42 views
1

我有以下問題理解singleinstance結合工程Autofac單實例

我有下面的類上市

public interface ICacheManager 
{ 
    object Get(string key); 

    void Set(string key, object data, int cacheTime); 

    bool IsSet(string key); 

    void Invalidate(string key); 
} 

如何實現如下

public class MemoryCacheManager : ICacheManager 
{ 
    private ObjectCache Cache 
    { 
     get { return MemoryCache.Default; } 
    } 

    public object Get(string key) 
    { 
     return Cache[key]; 
    } 

    public void Set(string key, object data, int cacheTime) 
    { 

     var policy = new CacheItemPolicy { AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime) }; 
     Cache.Add(new CacheItem(key, data), policy); 
    } 

    public bool IsSet(string key) 
    { 
     return Cache[key] != null; 
    } 

    public void Invalidate(string key) 
    { 
     Cache.Remove(key); 
    } 

} 

在autofac註冊如下

builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().SingleInstance(); 

現在我的問題是這樣的

說,我有一個使用的ICacheManager依賴

public class ClassA 
{ 
    private readonly ICacheManager _cacheManager; 
    public ClassA(ICacheManager cacheManager) 
    { 
     _cacheManager = cacheManager; 
    } 

    private void BindItem(object o) 
    { 
    if(!_cacheManager.IsSet("SOME_KEY")) 
     _cacheManager.Set("SOME_KEY", O, 60); 
    } 
} 

對象O已被添加到緩存中,如果的ICacheManager實例在後者解決後下面的類上市時間,它是否會包含新添加的項目。

+0

在你的情況下,它甚至不不管你如何註冊'MemoryCacheManager',因爲它不包含任何狀態。它只是重定向到「MemoryCache.Default」,並且是否包含新添加的項目直到「MemoryCache.Default」實現。 – Steven

+0

@Steven原諒我的天真,我應該知道它不會有任何區別。剛剛通過文檔 –

回答

12

當一個對象被註冊爲SingleInstance時,對於那個對象的第一個請求返回的完全相同的實例將會針對該對象實例的每個其他請求返回。所以,直接回答你的問題,是的。如果您從容器中解析ICacheManager,請將實例添加到緩存中,然後再請求ICacheManager實例,則第二個請求將收到與第一個請求完全相同的緩存管理器實例,並禁止緩存項目從緩存中彈出緩存,您的項目將出現在緩存中。

可以使用單元測試來驗證此行爲:

// NUnit test fixture - untested, please forgive any typos 
[TestFixture] 
public class AutofacComprehensionTest 
{ 
    internal interface ICacheManager {} 
    internal class ConcreteCacheManager : ICacheManager {} 

    [Test] 
    public void SingleInstance_causes_same_instance_to_be_returned_for_each_request() 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterType<ConcreteCacheManager>().As<ICacheManager>().SingleInstance(); 
     var container = builder.Build(); 
     var first = container.Resolve<ICacheManager>(); 
     var second = container.Resolve<ICacheManager>(); 
     Assert.That(first, Is.SameAs(second)); 
    } 
} 
+1

如果我們從另一個ContainerBuilder實例調用Resolve ,該怎麼辦? – YakRangi