我在理解单实例绑定(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/