2014-02-11 38 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