Autofac单实例

时间:2014-02-11 20:00:55

标签: c# asp.net-mvc 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实例在以后解析,它是否包含新添加的项。

1 个答案:

答案 0 :(得分: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));
    }
}