В сценарии реального времени разница между контейнером ядра Spring IOC (BeanFactory) и контейнером Advanced J2EE (ApplicationContext) выглядит следующим образом.
<bean></bean>
) только при вызове метода .getBean (), но в то время как ApplicationContext создает объекты для всех компонентов (<bean></bean>
, если его область явно не указана как «Prototype»), настроенный в spring.xml при загрузке самого файла spring.xml. /*
* Using core Container - Lazy container - Because it creates the bean objects On-Demand
*/
//creating a resource
Resource r = (Resource) new ClassPathResource("com.spring.resources/spring.xml");
//creating BeanFactory
BeanFactory factory=new XmlBeanFactory(r);
//Getting the bean for the POJO class "HelloWorld.java"
HelloWorld worldObj1 = (HelloWorld) factory.getBean("test");
ApplicationContext: (контейнер Eager из-за создания объектов всех одноэлементных компонентов при загрузке самого файла spring.xml) ApplicationContext context = new ClassPathXmlApplicationContext("com/ioc/constructorDI/resources/spring.xml");
В документации к конструктору Cache говорится, что это только для внутреннего использования. Чтобы получить объект Cache, вызовите HttpRuntime.Cache, а не создавайте экземпляр с помощью конструктора.
В то время как ОП указывал v3.5, вопрос задавался до выхода v4. Чтобы помочь любому, кто найдет этот вопрос и , жить с зависимостью v4, группа разработчиков создала новый кэш общего назначения для этого типа сценария. Он находится в пространстве имен System.Runtime.Caching: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx
Статическая ссылка на экземпляр кэша по умолчанию: MemoryCache.Default
Попробуйте
public class AspnetDataCache : IDataCache
{
private readonly Cache _cache;
public AspnetDataCache(Cache cache)
{
_cache = cache;
}
public AspnetDataCache()
: this(HttpRuntime.Cache)
{
}
public void Put(string key, object obj, TimeSpan expireNext)
{
if (key == null || obj == null)
return;
_cache.Insert(key, obj, null, DateTime.Now.Add(expireNext), TimeSpan.Zero);
}
public object Get(string key)
{
return _cache.Get(key);
}
Я закончил на этой странице, удивляясь тому же. Вот что я делаю (что мне не нравится, но, кажется, работает отлично):
HttpContext context = HttpContext.Current;
if (context == null)
{
HttpRequest request = new HttpRequest(string.Empty, "http://tempuri.org", string.Empty);
HttpResponse response = new HttpResponse(new StreamWriter(new MemoryStream()));
context = new HttpContext(request, response);
HttpContext.Current = context;
}
this.cache = context.Cache;
Класс System.Web.Caching.Cache полагается на то, что его член "_cacheInternal" установлен объектом HttpRuntime.
Чтобы использовать классы System.Web.Caching, вам нужно создать объект HttpRuntime и настроить свойство HttpRuntime.Cache. Вы бы эффективно подражали IIS.
Вам лучше использовать другие платформы кеширования, такие как:
Просто используйте Caching Application Block , если вы не хотите изобретать велосипед. Если вы все еще хотите использовать кеш ASP.NET- , см. Здесь . Я уверен, что это работает только с .NET 2.0 и выше, хотя. Просто невозможно было использовать кеш вне ASP.NET в .NET 1.
На странице MSDN также есть большое предупреждение о документации кеша:
Класс Cache не предназначен для использования вне приложений ASP.NET. Он был разработан и протестирован для использования в ASP.NET для обеспечения кэширования веб-приложений. В других типах приложений, таких как консольные приложения или приложения Windows Forms, кэширование ASP.NET может работать неправильно.
Для очень легкого решения, где вам не нужно беспокоиться об истечении срока действия и т. Д., Тогда достаточно словарного объекта.