Autofac单实例

Set*_* IK 1 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);
}
Run Code Online (Sandbox Code Playgroud)

实施如下

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

在autofac中注册如下

 builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)

现在我的问题是这个

说我有以下使用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);
   }
}
Run Code Online (Sandbox Code Playgroud)

将Object O添加到Cache后,如果ICacheManager实例在以后解析,它是否包含新添加的项.

Kal*_*son 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));
    }
}
Run Code Online (Sandbox Code Playgroud)