c# - Autofac 单实例

标签 c# asp.net-mvc autofac

我在理解单实例绑定(bind)如何工作时遇到以下问题

我有以下类列表

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

Object O 被添加到Cache 之后,如果稍后解析ICacheManager 实例,它是否包含新添加的项目。

最佳答案

当对象注册 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));
    }
}

关于c# - Autofac 单实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21711801/

相关文章:

asp.net-mvc - Autofac MVC 5 RegisterWebApiFilterProvider 导致无法解析的 IOverrideFilter

c# - 基类中的 Autofac 属性注入(inject)

c# - Prism 形式 : Application windows are expected to have a root VC

c# - 是否有通过一组库代码 (.net C#) 查找冗余的工具?

c# - 如何使 DateTime 模型属性成为必需的?

asp.net-mvc - 如何扩展 Microsoft.AspNet.Identity.EntityFramework.IdentityRole

c# - 用于查看 SharePoint 库中的照片的 Web 部件

c# - 您可以通过 Property setter 实例化对象吗?

c# - 在 cshtml 文件中使用模型对象

c# - 使用 Autofac 将对象注入(inject) MassTransit Saga