Как я могу использовать System.Web.Caching.Cache в консольном приложении?

В сценарии реального времени разница между контейнером ядра Spring IOC (BeanFactory) и контейнером Advanced J2EE (ApplicationContext) выглядит следующим образом.

  1. BeanFactory будет создавать объекты для bean-компонентов ( т.е. для классов POJO), упомянутых в файле spring.xml (<bean></bean>) только при вызове метода .getBean (), но в то время как ApplicationContext создает объекты для всех компонентов (<bean></bean>, если его область явно не указана как «Prototype»), настроенный в spring.xml при загрузке самого файла spring.xml.
  2. BeanFactory: (Lazy container, потому что он создает объекты для bean-компонентов только тогда, когда вы явно вызываете пользователя / main class)
    /*
     * 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");
    
  3. Технически использование ApplicationContext рекомендуется, поскольку в приложениях реального времени , объекты bean будут созданы, когда приложение запускается на сервере i tself. Это уменьшает время отклика для пользовательского запроса, поскольку объекты уже доступны для ответа.
29
задан Ron Klein 24 June 2009 в 13:53
поделиться

6 ответов

В документации к конструктору Cache говорится, что это только для внутреннего использования. Чтобы получить объект Cache, вызовите HttpRuntime.Cache, а не создавайте экземпляр с помощью конструктора.

56
ответ дан Amit G 24 June 2009 в 13:53
поделиться

В то время как ОП указывал v3.5, вопрос задавался до выхода v4. Чтобы помочь любому, кто найдет этот вопрос и , жить с зависимостью v4, группа разработчиков создала новый кэш общего назначения для этого типа сценария. Он находится в пространстве имен System.Runtime.Caching: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

Статическая ссылка на экземпляр кэша по умолчанию: MemoryCache.Default

28
ответ дан Joel Fillmore 24 June 2009 в 13:53
поделиться

Попробуйте

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

1
ответ дан Hans Malherbe 24 June 2009 в 13:53
поделиться

Я закончил на этой странице, удивляясь тому же. Вот что я делаю (что мне не нравится, но, кажется, работает отлично):

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;
4
ответ дан stealthyninja 24 June 2009 в 13:53
поделиться

Класс System.Web.Caching.Cache полагается на то, что его член "_cacheInternal" установлен объектом HttpRuntime.

Чтобы использовать классы System.Web.Caching, вам нужно создать объект HttpRuntime и настроить свойство HttpRuntime.Cache. Вы бы эффективно подражали IIS.

Вам лучше использовать другие платформы кеширования, такие как:

1
ответ дан d4nt 24 June 2009 в 13:53
поделиться

Просто используйте Caching Application Block , если вы не хотите изобретать велосипед. Если вы все еще хотите использовать кеш ASP.NET- , см. Здесь . Я уверен, что это работает только с .NET 2.0 и выше, хотя. Просто невозможно было использовать кеш вне ASP.NET в .NET 1.

На странице MSDN также есть большое предупреждение о документации кеша:

Класс Cache не предназначен для использования вне приложений ASP.NET. Он был разработан и протестирован для использования в ASP.NET для обеспечения кэширования веб-приложений. В других типах приложений, таких как консольные приложения или приложения Windows Forms, кэширование ASP.NET может работать неправильно.

Для очень легкого решения, где вам не нужно беспокоиться об истечении срока действия и т. Д., Тогда достаточно словарного объекта.

9
ответ дан RichardOD 24 June 2009 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: