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)
| 归档时间: |
|
| 查看次数: |
8362 次 |
| 最近记录: |